
LoSWS_ERROR_RESTORE Radishevsky N
Лекция "восстановление грамматического разбора при синтаксических ошибках"
До сих пор программа грамматического разбора лишь устанавливала, принадлежит ли входная последовательность символов языку L(G) .
В качестве побочного результата она также определяла структуру предложения.
Но если встречалась неправильная конструкция, задача программы могла считаться выполненной и она могла закончить работу. Разумеется, на практике такая схема неприемлема.
Вместо этого транслятор должен:
выдавать соответствующую диагностику об ошибках: тип ошибки, место ошибки
продолжать процесс грамматического разбора, возможно находя дальнейшие ошибки.
Чтобы продолжать работу, нужно либо сделать какие-то предположения о том, что на самом деле имел в виду автор неправильной программы, либо пропустить некоторую часть входной последовательности, либо сделать и то, и другое. Сделать достаточно разумные предположения о действительных намерениях программиста — довольно сложно. До сих пор это не удавалось формализовать, поскольку формальный подход к синтаксису и грамматическому разбору не учитывает многие факторы, сильно влияющие на человеческое сознание.
Например, распространенной ошибкой является пропуск знаков пунктуации, таких, как точка с запятой (не только в программировании!), но весьма маловероятно, что кто-то пропустит знак «+» в арифметическом выражении. Для программы грамматического разбора и точка с запятой, и плюс — просто терминальные символы без какого-либо существенного различия; а для человека точка с запятой почти не имеет значения и в конце строки кажется избыточной, тогда как знак арифметической операции, бесспорно, осмыслен.
При разработке подходящей системы восстановления следует принимать во внимание многие подобные соображения, которые связаны с конкретным языком и не могут обобщаться для всех контекстно-свободных языков.
Типы ошибок
По месту обнаружения
Лексические ошибки. Ошибки в служебных словах – began, wile, .. Превышение длины идентификаторов и констант. Несуществующие терминальные символы >= =>
Синтаксические ошибки. Пропуски знаков препинания , ;
Семантические ошибки. Необъявленные переменные. Несоответствие типов данных.
По времени обнаружения
В процессе компиляции
В процессе выполнения. Деление на ноль, переполнение разрядной сетки, выход индекса за пределы массива
По характеру ошибок
Пропуск разделительных знаков ; ,
Пропуск знака операции * в произведениях переменных a*b ab
Пропуск, вставка, замена букв при наборе
Множества и их описание в Паскале
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 |