Читайте также: |
|
Типы ошибок
По месту обнаружения
1. Лексические ошибки. Ошибки в служебных словах – began, wile,.. Превышение длины идентификаторов и констант. Несуществующие терминальные символы >= =>
2. Синтаксические ошибки. Пропуски знаков препинания,;
3. Семантические ошибки. Необъявленные переменные. Несоответствие типов данных.
По времени обнаружения
1. В процессе компиляции
2. В процессе выполнения. Деление на ноль, переполнение разрядной сетки, выход индекса за пределы массива
По характеру ошибок
1. Пропуск разделительных знаков;,
2. Пропуск знака операции * в произведениях переменных a*b ab
3. Пропуск, вставка, замена букв при наборе
Множества и их описание в Паскале
Type T = set of T0
Здесь
T - имя нового типа
T0 – имя базового типа
Примеры
type intset = set of 0.. 30
type charset = set of char
type lexset = set of lexem
type lexem = (plus, minus,..., ifsym, dosym)
var
is: intset
cs: charset
tock: lexem
Присваивание
is:= [1, 4, 16, 25];
cs:= [‘+’, ‘–‘, ‘*’, ‘/’];
tock:= [ ];
tock:= [ plus, minus];
tock:= [plus.. dosym ];
Операции со множествами
Мат.симв | операция | Знак опер. | Тип рез-та |
xÎ M | принадлежность | in | boolean |
A Ç B | Пересечение | * | set |
A È B | Объединение | + | set |
A \ B | Разность | – | set |
Принципы восстановления
Все же существуют некоторые правила и рекомендации, действующие не только в рамках одного языка. Для них, пожалуй, характерно, что они в равной мере связаны как с исходной концепцией языка, так и с механизмом восстановления в программе грамматического разбора.
Пропуск части входной последовательности
Прежде всего, совершенно ясно, что эффективное восстановление возможно или, во всяком случае, намного облегчается лишь в случае языка с простой структурой.
В частности, если при обнаружении ошибки пропускается какая-то часть входной последовательности, то язык обязательно должен содержать служебные слова, неправильное употребление которых крайне маловероятно и которые поэтому могут использоваться для возобновления грамматического разбора.
В Паскале это правило строго соблюдается: каждый оператор начинается с однозначного служебного слова, такого, как begin, if, while; то же относится к описаниям: они начинаются с var, const или procedure.
Мы назовем это правилом служебных слов, а само множество символов – символами возобновления - renew_sym [ri`nju:].
renew_sym: tsym
renew_sym:= [ ifsym, whilesym, begsym]
Не поднимать панику
Второе правило более непосредственно связано с построением программы грамматического разбора. Для нисходящего анализа характерно, что цели разбиваются на подцели; при этом процедуры вызывают другие процедуры, соответствующие этим подцелям. Второе правило определяет, что если процедура грамматического разбора обнаруживает ошибку, то она не должна прекращать работу и сообщать о случившемся вызвавшей ее процедуре. Вместо этого она должна самостоятельно продолжать просмотр текста до того места, откуда можно возобновить анализ. Мы назовем это правилом «не поднимай панику». Из него следует, что из процедуры грамматического разбора не может быть другого выхода, кроме обычного завершения работы.
Правило «не поднимай панику» можно интерпретировать следующим образом: при появлении неправильной конструкции процедура должна пропустить входной текст, пока не встретится символ, который по правилам может следовать за той конструкцией языка, которую она пыталась обнаружить. Это означает, что каждой процедуре грамматического разбора в момент текущей ее активации должно быть известно множество внешних символов - out_sym.
out_sym: tsym
Определение внешних символов
(для грамматики арифметических выражений)
1 Prog
| |||
.
2 EXPR
3 ADD
4 MULT
процедура | Внешние символы | out_sym |
Expr | .) | dot r_parent |
Add | + –.) | plus minus dot r_parent |
Mult | * / + –.) | Umn div plus minus dot r_parent |
Поэтому на первом этапе уточнения (или дополнения) мы снабдим каждую процедуру грамматического разбора явным параметром fsys, который задает возможные внешние символы. В конце каждой процедуры вставляется явная проверка: действительно ли следующий символ входного текста содержится среди этих внешних символов (если это уже не обусловлено логикой программы)?
Все же с нашей стороны было бы неразумно при всех обстоятельствах пропускать входной текст до следующего появления такого внешнего символа. В конце концов, программист мог по ошибке пропустить всего один символ (например, точку с запятой), а игнорирование текста до следующего внешнего символа может иметь гибельные последствия. Поэтому к множествам символов, которые прекращают пропуск текста, мы добавим служебные слова, отмечающие начало конструкции, которую не следует пропускать. Таким образом, символы, передаваемые в качестве параметров процедуре грамматического разбора, — это символы возобновления, а не просто внешние символы. Мы можем считать, что множества символов возобновления с самого начала содержат отдельные служебные слова и при проходе иерархии подцелей грамматического разбора постепенно дополняются внешними символами этих подцелей. Для удобства вводится общая подпрограмма, называемая test,—она выполняет описанную выше проверку.
Эта процедура имеет три параметра:
1. Множество sl допустимых следующих символов; если текущий символ к нему не принадлежит, то имеет место ошибка.
2. Множество s2 дополнительных символов возобновления, появление которых определенно является ошибкой, но которые ни в коем случае не следует пропускать.
3. Номер n, который присваивается ошибке, если процедура ее обнаружит.
Процедура возобновления
procedure test (sl, s2: symset; n: integer);
begin
if not (sym in sl)
then
begin
error(n);
sl:= sl + s2;
while not (sym in sl) do getsym
end
end
Процедуру возобновления удобно использовать при входе в процедуру грамматического разбора для проверки, является ли текущий символ допустимым начальным символом анализируемой конструкции. Это рекомендуется во всех случаях, когда процедура Х вызывается безусловно, как в операторе
if sym = a1
then S1
else if sym = aN
then SN
else X
который получен из порождающего правила
A::- a1 S1 |...| aN SN | X. (5.18- 1)
В этих случаях параметр sl должен содержать множество начальных символов X, а s2 — множество внешних символов A (см. табл. 5.2 1).
Подробно эта процедура показана в программе 5.5, которая представляет собой дополненную версию программы 5.4. Для удобства читателя вся программа приведена полностью, за исключением инициации глобальных переменных и процедуры getsym, оставшихся без изменений.
Дата добавления: 2015-10-26; просмотров: 204 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Literary theory | | | Вимкнути лазер. |