Анимация
JavaScript
|
Главная Библионтека где «;» является недопустимой, исправление ошибки - идеальное. Однако исключение скобок обычно нарушает скобочную структуру программы и приводит к дальнейшим синтаксическим ошибкам. 3. Включение символов LL(1) - анализатор на любой стадии разбора должен иметь наготове множество действительных символов продолжения. В некоторых случаях оправдано исправление программы путем подстановки одного из этих символов перед допустимым символом, который вызвал ошибку. Например, последовательность End begin никогда не будет допустимой в Алголе 68. Однако, включение «;» между end и begin позволит анализатору продолжить работу. (Последующая информация, имеющаяся в распоряжении анализатора, может подсказать, что здесь более уместна запятая.) В целом же мы можем утверждать, (в отношении Алгола 68), что если встречается синтаксическая ошибка и недопустимым считается один из символов begin, If, Case, ( а предыдущем считанным - один из символов end, fi, esac, ) то при включении «;» (или «,») анализатор продолжит работу. Конечно, могла иметь место и неправильная подстановка, даже если анализатор продолжил разбор. Например, мог пропустить между символами end и begin символ «+» или «-». 4. Правила для ошибок Один из способов исправления некоторых типов синтаксических ошибок заключается в расширении синтаксиса языка за счет включения в него программ, содержащих данные ошибки. Это не значит, что включены сообщающие о них действия, но анализатор не будет считать такой вход недопустимым, и не потребуется никаких исправлений. Так можно обращаться, например, с ошибками типа «;» перед end как в Алголе 68, или пропуск «;» перед последовательностью L: end в Алголе 60. Дополнительные правила, включенные в грамматику, обычно называются «правилами для ошибок». Они неизбежно приводят к увеличению грамматики (и анализатора), и поэтому включать их следует только для наиболее часто встречающихся ошибок программирования. Необходимо также следить за тем, чтобы при включении этих дополнительных правил грамматика не стала неоднозначной. Предупреждения Наряду с сообщением о синтаксических ошибках анализатор может выдавать предупреждения, когда ему встречается допустимая, но маловероятная последовательность символов, например Эти предупреждения, как мы видели, могут быть в программах, написанных на Алголе 68,но в синтаксически правильных программах используются редко. В грамматику может вводиться действие, которое при каждом считывании do проверяет символ предыдущий, не является ли он «;» Сообщения о синтаксических ошибках Всякий раз при обнаружении анализатором синтаксической ошибки должно печататься соответствующее сообщение. Например, может выдаваться, такое сообщение, как SYNTAXC ERROR IN LINE 22 Или местоположение ошибки может описываться полнее LINE 22 SYMBOL 4 В любом из этих случаев может быть недоволен тем, что сообщение не вполне ясное, так как не указывает, в чем заключается ошибка программиста. Как уже отмечалось, фактическая ошибка программирования могла произойти гораздо раньше, анализатор сообщает об ошибке только тогда, когда ему встречается недопустимый символ. Если программист представляет анализатору программу, написанную, как предполагается, на ПЛ/1, не имеюш;ую синтаксическую ошибку, компилятор не сможет решить, какую программу на ПЛ/1 программист должен был бы написать. Единственное, что компилятор смог бы сделать, это принять решение о «ремонте» на минимальном расстоянии, т.е. о ремонте, требующем минимальное число включений символов в текст программы и исключений из него, дающих синтаксически правильную программу. Мы употребляем здесь термин «ремонт на минимальном расстоянии», поскольку нет никакой гарантии, что этот ремонт действительно позволит получить эту программу, которая имелась в виду в самом начале. Цель ремонта- обеспечить анализатору условия для продолжения анализа программы. Алгоритмы ремонта на минимальном расстояний приводятся в [4]. Хотя теоретически ремонт на минимальном расстояний кажется привлекательным, его реализация неэффективна, так как приходится часто возвращаться назад по уже проанализированным частям программы и отменять выполненные ранее компилятором действия. Большинство компиляторов не берется за такой ремонт. Единственное исправление, которое они осуществляют, - это вставка, исключение или изменение символов в том месте, где обнаружена ошибка. В этом случае компилятор не может предоставить пользователю иной информации, кроме точного указания о том, где обнаружена ошибка. Компилятору может быть известен еще и контекст, в котором обнаружена ошибка, например, она могла произойти в пределах присваивания, в границах массива или в вызове процедуры. Такая информация не всегда оказывается ценной для пользователя, но она показывает, какой тип конструкции пытался распознать анализатор, когда обнаружил ошибку, а это поможет найти фактическую ошибку программирования. Можно было бы также сообщить пользователю, какие символы допустимы при встрече недопустимого символа, что тоже помогло бы пользователю в исправлений программы. Если анализатор способен (в некоторых случаях) сделать разумное предположение о том, какая фактическая ошибка программирования была допущена, он может исправить программу (для последующих проходов), но это возможно лишь тогда, когда он четко сообщает пользователю, какое действие при этом выполняется. Для исправления программы, (но не ремонта) необходимо знать истинные намерения программиста. Так, на экзамене по программированию студенту обычно предлагается классическая задача: «Исправьте следующую программу Однако что ожидается от студента? Должен ли он найти исправление на минимальном расстоянии (оно ведь может быть не единственным), требуемое для получения синтаксически правильной программы, или ему нужно изменить текст, чтобы получить программу, которую, по его мнению, намеревался написать программист (или экзаменатор)? Формулировка задачи представляется неточной. 12.5. Контекстно-зависимые ошибки Мы уже видели, что некоторые конструкции типичных языков программирования нельзя описать с помощью контекстно-свободной грамматики, поэтому анализатор, как правило, базируется на контекстно-свободной грамматике, генерирующей сверхмножество компилируемого языка. Следовательно, с точки зрения таблицы разбора программы с неописанными идентификаторами и т. п. синтаксически правильны. Однако любые такие контекстно-зависимые ошибки будут обнаружены действиями, включаемыми в контекстно-свободную грамматику и вызываемыми анализатором, который запрашивает таблицу символов и т. п. Об ошибках подобного типа обычно выдаются четкие сообщения при наличии таблицы идентификаторов, созданной во время лексического анализа, например IDENTIFIER XYZ NOT DECLARED TYPES NOT COMPATIBLE IN ASSIGNMENT А на Алголе 68: ILLEGAL MODE DECLARETION BALANCING NOT POSSIBLE Так как сам анализатор ошибку не обнаружил, никакого исправления не требуется. Однако, если не принять соответствующие меры, то одна ошибка может повлечь за собой лавину сообщений об ошибках. Например, если в описании идентификатора допущена ошибка в написании Int Wednesday 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 [ 56 ] 57 58 59 60 61 62 63 64 65 66 67 68 69 |