
- •1. Формальная постановка задачи Задание 10.
- •2. Описание входного языка
- •2.1. Синтаксис входного языка
- •2.2. Описание семантики входного языка
- •3 Описание этапа лексического анализа
- •3.1. Определение типов лексем
- •Определение синтаксиса лексем.
- •Построение диаграммы лексического анализатора.
- •Функции лексического анализатора
- •Описание этапа синтаксического анализа.
- •4.1. Построение кс-грамматики входного языка.
- •Разбиение исходной грамматики на подграмматики.
- •Описание промежуточного языка.
- •4.4. Неформальное описание перевода.
- •4.5. Посторенние атрибутной транслирующей грамматики.
- •4.6. Построение атрибутного дмп-процессора.
- •4.7. Тестирование атрибутного дмп-процессора
Функции лексического анализатора
IDENT - ищет текущий идентификатор в таблице идентификаторов. Если таковой в таблице имеется, то во входной поток записывается токен, соответствующий этой лексеме, иначе – вставляет запись об этом идентификаторе в таблицу идентификаторов и пишет в выходной поток IDENT.
VOID, MAIN,VECTOR, IF, FOR ELSE, CIN>> , COUT<<, GOTO, AND, NOT,OR –соответствующая лексема записывается в выходной поток(так как формально каждое ключевое слово хранится в отдельной таблице).
Separator – пишет в выходной поток конкретный разделитель.
NatNumber - ищет текущую константу в таблице констант(если не находит, то записывает туда) и выводит в выходной поток токен NatNumber.
AssignRel - пишет в выходной поток конкретный разделитель, так как они хранятся в разных таблицах.
AddOperation – пишет в выходной поток токен AddOperation.
MultOperation– пишет в выходной поток токен MultOperation.
RelOperation- пишет в выходной поток токен RelOperation
UnaryOperation – пишет в выходной поток конкретную унарную операцию.
Пусть на вход тестируемого лексического анализатора подана следующая входная цепочка:
void main()
{ int a;
a=5;
vector b[3];
b=[2.0, a, 4.1];
if(b[1]==a)
cout >> a;
В ходе разбора указанной цепочки будут созданы таблицы идентификаторов вида:
0 |
a |
1 |
b |
2 |
c |
целочисленных констант:
0 |
5 |
1 |
3 |
2 |
1 |
вещественных констант:
0 |
2.0 |
1 |
4.1 |
На выходе лексического анализатора программа будет представлена потоком токенов:
VOID
MAIN
(
)
{
TypeBase
Ident
;
Ident
AssignRel
CI
;
VECTOR
Ident
[
CI
]
;
Ident
=
[
CF
,
CF
,
CF
]
;
IF
(
CF
RelOperation
Ident
)
COUT>>
Ident
;
}
Исходная программа будет выглядеть как
№ таблицы |
Индекс |
0 |
0 |
1 |
0 |
22 |
8 |
22 |
9 |
22 |
4 |
8 |
0 |
24 |
0 |
22 |
2 |
24 |
0 |
16 |
0 |
25 |
0 |
22 |
2 |
6 |
0 |
24 |
1 |
22 |
6 |
25 |
1 |
22 |
7 |
22 |
2 |
24 |
1 |
16 |
0 |
22 |
6 |
26 |
0 |
22 |
0 |
24 |
0 |
22 |
0 |
26 |
1 |
22 |
7 |
22 |
2 |
2 |
0 |
22 |
8 |
24 |
1 |
22 |
6 |
25 |
2 |
22 |
7 |
23 |
4 |
24 |
0 |
22 |
9 |
7 |
1 |
24 |
0 |
22 |
2 |
22 |
5 |