Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / analizzatore

.html
Скачиваний:
17
Добавлен:
28.06.2014
Размер:
16.91 Кб
Скачать

Синтаксический анализатор Синтаксический анализатор 1. Введение Задача синтаксического анализатора – проверить правильность записи выражения и разбить его на лексемы. Лексемой называется неделимая часть выражения, состоящая, в общем случае, из нескольких символов. Для арифметических и логических выражений лексемами будут: имена переменных; имена функций; константы; операции – арифметические (+, -, *, /), логические (!, &&, ||) и сравнения (==, !=, >, >=, <, <=); открывающая скобка; закрывающая скобка. Обычно лексемы разделяются пробелами, хотя возможны ситуации, когда появление новой лексемы обозначает конец предыдущей. Например, знак арифметической операции заканчивает имя стоящей перед ним переменной. При реализации синтаксического анализатора надо все символы, которые могут встретиться в обрабатываемой строке, разбить на группы таким образом, чтобы все символы группы вызывали одинаковую реакцию синтаксического анализатора. Например, при разборе арифметических и логических выражений все цифры 0-9 будут вызывать одинаковую реакцию. Кроме того, необходимо выделить состояния синтаксического анализатора. Состояние определяет, какие символы в данный момент могут быть на входе синтаксического анализатора, и какова будет реакция на этот символ. Например, если на вход синтаксического анализатора пришла цифра, то он переходит в состояние «Константа», и до завершения константы (т.е. до появления пробела, знака операции, закрывающей скобки или конца строки) на вход синтаксического анализатора могут приходить только цифры и точка, если константа вещественная. Причём, естественно, точка может встречаться только один раз, что приводит к делению состояния «Константа» на два состояния: «Константа до точки», в котором точка может появиться, и «Константа после точки», в котором появление точки будет считаться ошибкой. Одно состояние является начальным – с него начинается работа синтаксического анализатора, и одно или несколько состояний должны быть конечными. Далее строиться таблица, которая определяет реакцию синтаксического анализатора на входные символы в зависимости от состояния. Реакция обычно заключается в смене состояния синтаксического анализатора и ещё каких-то действиях, например, запись очередного символа во временную переменную, увеличение или уменьшение уровня вложенности при появлении скобок и т.д. Обычно в программе синтаксический анализатор реализуется как бесконечный цикл (for ( ; ; ) { ... }) с выходами в случае ошибки или при достижении конца обрабатываемой строки (обратите внимание, что достижение конца строки ещё не означает правильность выражения). Внутри цикла пишется условный блок, например, по группам символов, и в каждой части этого условного блока – свой условный блок (или оператор-переключатель) по состояниям синтаксического анализатора. Состояния синтаксического анализатора в программе для простоты обозначаются номерами, однако, чтобы не путаться в этих номерах, можно задать им осмысленные имена с помощью конструкции #define или константы перечислимого типа enum.

Если выражение записано верно, то в результате работы синтаксического анализатора должен появиться список лексем (можно реализовать его как массив, а не настоящий список). Поскольку элементы массива должны иметь одинаковый тип, надо выбрать такую структуру, с помощью которой можно представить все возможные лексемы. Это можно сделать, если, например, каждый элемент массива представляет собой структуру, состоящую из двух полей: тип лексемы и её номер в списке лексем этого типа. Часть лексем в арифметических и логических выражениях состоят из одного символа, но имена переменных и функций и константы в общем случае состоят из нескольких символов. Поэтому входные символы надо записывать во временную переменную, и когда данная лексема заканчивается, проверять, что она из себя представляет. Не забудьте, что одна и та же переменная может входить в выражение несколько раз, поэтому каждый раз, когда имя переменной сформировалось, надо проверять, была ли она уже в списке переменных. Не забудьте, что при достижении конца обрабатываемого выражения надо проверить, что количество открывающих и закрывающих скобок было одинаковым (вложенность = 0). 2. Анализ арифметических выражений

Состояния Операнд (исходное) – должен появиться операнд (константа, переменная, функция, выражение в скобках). Оператор – должен появиться оператор. Имя – имя переменной или функции началось, но ещё не закончилось. Константа до точки – константа началась, но ещё не закончилась, точки не было. Константа после точки – константа началась, но ещё не закончилась, точка была. Параметры функции – это состояние возникает, когда после имени, идентифицированного как имя функции, появился пробел. Единственный возможный символ в этом состоянии – открывающая скобка. Ошибки Пропущен операнд Неверно расставлены скобки Неверный символ «...» Пропущен оператор Не заданы параметры функции «...» Неизвестная функция «...» Неверное имя «...» Неверная константа «...» 3. Анализ логических выражений

Состояния Операнд (исходное) – должен появиться операнд (константа, переменная, функция, выражение в скобках). Оператор – должен появиться оператор. Переменная – имя переменной началось, но ещё не закончилось. Константа до точки – константа началась, но ещё не закончилась. = – был знак равенства, следующий символ тоже должен быть знаком равенства. ! – был восклицательный знак, следующий символ должен быть знаком равенства. > – был знак «больше», следующий символ должен быть знаком равенства, или может начаться следующий операнд. < – был знак «меньше», следующий символ должен быть знаком равенства, или может начаться следующий операнд. & – был амперсант, следующий символ тоже должен быть амперсантом. | – была вертикальная черта, следующий символ тоже должен быть вертикальной чертой. Ошибки Пропущен операнд Неверно расставлены скобки Неверный символ «...» Пропущен оператор Неверная константа «...» Неверный оператор «...» Для логических выражений надо учитывать, что после операции сравнения должна идти логическая операция. Поэтому вводится признак «следующая операция», который обозначает, какая операция должна быть следующей – любая или только логическая. 4. Таблица для синтаксического анализатора арифметических выражений     0...1 a...z, A...Z, _ Пробел +, -, *, / ( ) . \0 Остальные 1. Операнд (исходное) Состояние 4 Состояние 3   Ошибка 1 Вложенность++ Ошибка 2 Состояние 5 Ошибка 1 Ошибка 3 2. Оператор Ошибка 4 Ошибка 4   Состояние 1 Ошибка 4 Вложенность-- Ошибка 3 ОК Ошибка 3 3. Имя     Если имя – функция, то состояние 6, иначе состояние 2 Если имя – функция, то ошибка 5, иначе переход в состояние 2 и повторная обработка этого же символа, что приводит к переходу в состояние 1 Если имя – функция, то состояние 1, иначе ошибка 6. Вложенность++ Если имя – функция, то ошибка 2, иначе состояние 2. Вложенность-- Ошибка 7 Если имя – функция, то ошибка 5, иначе ОК Ошибка 3 4. Константа до точки   Ошибка 8 Состояние 2 Переход в состояние 2 и повторная обработка этого же символа, что приводит к переходу в состояние 1 Ошибка 4 Состояние 2. Вложенность-- Состояние 5 ОК Ошибка 3 5. Константа после точки   Ошибка 8 Состояние 2 Переход в состояние 2 и повторная обработка этого же символа, что приводит к переходу в состояние 1 Ошибка 4 Состояние 2. Вложенность-- Ошибка 8 ОК Ошибка 3 6. Параметры функции Ошибка 5 Ошибка 5   Ошибка 5 Состояние 1. Вложенность++ Ошибка 2 Ошибка 5 Ошибка 5 Ошибка 3 5. Таблица для синтаксического анализатора логических выражений     0...1 a...z, A...Z, _ Пробел = ! > < & | ( ) \0 Остальные 1. Операнд (исходное) Состояние 4 Состояние 3   Ошибка 1 Операция «НЕ». Состояние 1 Ошибка 1 Ошибка 1 Ошибка 1 Ошибка 1 Если следующая операция – любая, то вложенность++, иначе ошибка 2 Ошибка 2 Ошибка 1 Ошибка 3 2. Оператор Ошибка 4 Ошибка 4   Если следующая операция – любая, то состояние 5, иначе ошибка 6 Если следующая операция – любая, то состояние 6, иначе ошибка 6 Если следующая операция – любая, то состояние 7, иначе ошибка 6 Если следующая операция – любая, то состояние 8, иначе ошибка 6 Если следующая операция – любая, то состояние 9, иначе ошибка 6 Если следующая операция – любая, то состояние 10, иначе ошибка 6 Ошибка 4 Вложенность--. Следующая операция – логическая ОК Ошибка 3 3. Переменная     Состояние 2 Если следующая операция – любая, то состояние 5, иначе ошибка 6 Если следующая операция – любая, то состояние 6, иначе ошибка 6 Если следующая операция – любая, то состояние 7, иначе ошибка 6 Если следующая операция – любая, то состояние 8, иначе ошибка 6 Если следующая операция – любая, то состояние 9, иначе ошибка 6 Если следующая операция – любая, то состояние 10, иначе ошибка 6 Ошибка 4 Состояние 2. Вложенность--. Следующая операция – логическая ОК Ошибка 3 4. Константа   Ошибка 5 Состояние 2 Если следующая операция – любая, то состояние 5, иначе ошибка 6 Если следующая операция – любая, то состояние 6, иначе ошибка 6 Если следующая операция – любая, то состояние 7, иначе ошибка 6 Если следующая операция – любая, то состояние 8, иначе ошибка 6 Если следующая операция – любая, то состояние 9, иначе ошибка 6 Если следующая операция – любая, то состояние 10, иначе ошибка 6 Ошибка 4 Состояние 2. Вложенность--. Следующая операция – логическая ОК Ошибка 3 5. = Ошибка 4 Ошибка 4 Ошибка 4 Операция «==». Следующая операция – логическая Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 4 Ошибка 4 Ошибка 4 Ошибка 3 6. ! Ошибка 4 Ошибка 4 Ошибка 4 Операция «!=». Следующая операция – логическая. Состояние 1 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 4 Ошибка 4 Ошибка 4 Ошибка 3 7. > Операция «>». Следующая операция – логическая. Состояние 4 Операция «>». Следующая операция – логическая. Состояние 3 Операция «>». Следующая операция – логическая. Состояние 1 Операция «>=». Следующая операция – логическая. Состояние 1 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 4 Ошибка 4 Ошибка 4 Ошибка 3 8. < Операция «<». Следующая операция – логическая. Состояние 4 Операция «<». Следующая операция – логическая. Состояние 3 Операция «<». Следующая операция – логическая. Состояние 1 Операция «<=». Следующая операция – логическая. Состояние 1 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 4 Ошибка 4 Ошибка 4 Ошибка 3 9. & Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Операция «&&». Следующая операция – любая. Состояние 1 Ошибка 6 Ошибка 4 Ошибка 4 Ошибка 4 Ошибка 3 10. | Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Ошибка 6 Операция «||». Следующая операция – любая. Состояние 1 Ошибка 4 Ошибка 4 Ошибка 4 Ошибка 3

Файл в формате Word

Содержание

Соседние файлы в папке Лекции