Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LoSWS_L_07_Error_Restore.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
138.24 Кб
Скачать

LoSWS_ERROR_RESTORE Radishevsky N 12

Лекция "восстановление грамматического разбора при синтаксических ошибках"

До сих пор программа грамматического разбора лишь устанавливала, принадлежит ли входная последовательность символов языку  L(G) .

В качестве побочного результата она также определяла структуру предложения.

Но если встречалась не­правильная конструкция, задача программы могла считаться выполненной и она могла закончить работу. Разумеется, на практике такая схема неприемлема.

Вместо этого транслятор должен:

  • выдавать соответствующую диагностику об ошибках: тип ошибки, место ошибки

  • продолжать процесс грамматического разбора, возможно находя дальнейшие ошибки.

Чтобы продолжать работу, нужно либо сделать какие-то предположения о том, что на самом деле имел в виду автор неправильной программы, либо про­пустить некоторую часть входной последовательности, либо сделать и то, и другое. Сделать достаточно разумные пред­положения о действительных намерениях программиста — до­вольно сложно. До сих пор это не удавалось формализовать, поскольку формальный подход к синтаксису и грамматиче­скому разбору не учитывает многие факторы, сильно влияю­щие на человеческое сознание.

Например, распространенной ошибкой является пропуск знаков пунктуации, таких, как точка с запятой (не только в программировании!), но весьма маловероятно, что кто-то пропустит знак «+» в арифметиче­ском выражении. Для программы грамматического разбора и точка с запятой, и плюс — просто терминальные символы без какого-либо существенного различия; а для человека точка с запятой почти не имеет значения и в конце строки кажется избыточной, тогда как знак арифметической опера­ции, бесспорно, осмыслен.

При разработке подходящей си­стемы восстановления следует принимать во внимание многие подобные соображения, которые связаны с конкретным язы­ком и не могут обобщаться для всех контекстно-свободных языков.

Типы ошибок

По месту обнаружения

  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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]