- •Министерство образования
- •Исходная постановка задачи
- •1. Описание входного языка
- •2. Этап лексического анализа Определение типов лексем
- •Соотношения токенов и лексем.
- •Функции лексического анализатора
- •3. Описание синтаксического анализа
- •1) Главная подграмматика
- •2) Подграмматика if/for
- •3) Подграмматика объявлений
- •5. Тестирование дмп-процессора
Функции лексического анализатора
KEYWORD- ищет полученную лексемуLeksemв таблицах ключевых слов. Если ключевой слово, то на выход подается пара: номер таблицыTableи индексIndex. Перевод головки лексического анализатора на одно состояние назад.
void KEYWORD ( leks Leksem, int &Table, int &Index)
IDENT- ищетполученную лексему Leksemв таблице идентификаторов. Если она в таблице имеется, то на выход подается номер таблицыTableи индексIndex, в противном случае новый идентификатор записывается в таблицу идентификаторов, и на выходе получаем номер таблицы и его индекс. Перевод головки лексического анализатора на одно состояние назад.
void IDENT ( leks Leksem, int &Table, int &Index)
ZCONST- ищет полученную лексемуLeksemв таблице целочисленных констант. Если она в таблице имеется, то на выход подается номер таблицыTableи индексIndex, в противном случае новый идентификатор записывается в таблицу идентификаторов, и на выходе получаем номер таблицы и его индекс.Перевод головки лексического анализатора на одно состояние назад.
void ZCONST ( leks Leksem, int &Table, int &Index)
RCONST- ищет полученную лексемуLeksemв таблице вещественных констант. Если таковая в таблице имеется, то на выходе – номер таблицыTableи индексIndex, соответствующий этой лексеме, иначе – вставляет запись об этой константе в таблицу целочисленных констант, и опять же на выход подается номер таблицы и индекс. Перевод головки лексического анализатора на одно состояние назад.
void RCONST ( leks Leksem, int &Table, int &Index)
SEPAR–ищет полученную лексемуLeksemв таблице разделителей. Если разделитель найден, то на выход подается пара: номер таблицыTableи индексIndex, иначе – сообщение об ошибке. Перевод головки лексического анализатора на одно состояние назад.
void SEPAR ( leks Leksem, int &Table, int &Index)
BOPER– ищет полученную лексемуLeksemв таблице бинарных операций. Если лексема найден, то на выход подается пара: номер таблицыTableи индексIndex, иначе – сообщение об ошибке. Перевод головки лексического анализатора на одно состояние назад.
void BOPER ( leks Leksem, int &Table, int &Index)
UOPER– – ищет полученную лексемуLeksemв таблице унарных операций. Если лексема найден, то на выход подается пара: номер таблицыTableи индексIndex, иначе – сообщение об ошибке. Перевод головки лексического анализатора на одно состояние назад.
void UOPER ( leks Leksem, int &Table, int &Index)
RELAT– – ищет полученную лексемуLeksemв таблице отношений. Если лексема найден, то на выход подается пара: номер таблицыTableи индексIndex, иначе – сообщение об ошибке. Перевод головки лексического анализатора на одно состояние назад.
void RELAT ( leks Leksem, int &Table, int &Index)
ASSIGN– – ищет полученную лексемуLeksemв таблице операторов присваивания. Если лексема найден, то на выход подается пара: номер таблицыTableи индексIndex, иначе – сообщение об ошибке. Перевод головки лексического анализатора на одно состояние назад.
void ASSIGN ( leks Leksem, int &Table, int &Index)
SEIO– – ищет полученную лексемуLeksemв таблице символов ввода/вывода. Если лексема найден, то на выход подается пара: номер таблицыTableи индексIndex, иначе – сообщение об ошибке. Перевод головки лексического анализатора на одно состояние назад.
void SEIO ( leks Leksem, int &Table, int &Index)
Тестирование лексического анализатора
Пример входной программы:
void main ()
{ int x = 7;
int y = 5;
if (x > y)
cout<<x;
else
cout<<y;
}
В ходе разбора указанной цепочки будут созданы таблица идентификаторов вида
№ таблицы |
индекс |
значение |
19 |
0 |
х |
|
1 |
y |
Таблица целочисленных констант:
№ таблицы |
индекс |
значение |
20 |
0 |
7 |
1 |
5 |
Выход лексического анализатора:
№ таблицы |
Индекс |
Лексема |
|
№ таблицы |
Индекс |
Лексема |
11 |
0 |
void |
19 |
0 |
x | |
12 |
0 |
main |
17 |
1 |
> | |
16 |
6 |
( |
19 |
1 |
y | |
16 |
7 |
) |
16 |
7 |
) | |
16 |
4 |
{ |
7 |
0 |
cout | |
8 |
0 |
int |
18 |
1 |
<< | |
19 |
0 |
x |
19 |
0 |
x | |
13 |
0 |
= |
16 |
2 |
; | |
20 |
0 |
7 |
1 |
0 |
else | |
16 |
2 |
; |
7 |
0 |
cout | |
8 |
0 |
int |
18 |
1 |
<< | |
19 |
1 |
y |
19 |
1 |
y | |
13 |
0 |
= |
16 |
2 |
; | |
20 |
1 |
5 |
16 |
5 |
} | |
16 |
2 |
; |
|
|
| |
0 |
0 |
if |
|
|
| |
16 |
6 |
( |
|
|
|