
- •1. Формальная постановка задачи Задание 10.
- •2. Описание входного языка
- •2.1. Синтаксис входного языка
- •2.2. Описание семантики входного языка
- •3 Описание этапа лексического анализа
- •3.1. Определение типов лексем
- •Определение синтаксиса лексем.
- •Построение диаграммы лексического анализатора.
- •Функции лексического анализатора
- •Описание этапа синтаксического анализа.
- •4.1. Построение кс-грамматики входного языка.
- •Разбиение исходной грамматики на подграмматики.
- •Описание промежуточного языка.
- •4.4. Неформальное описание перевода.
- •4.5. Посторенние атрибутной транслирующей грамматики.
- •4.6. Построение атрибутного дмп-процессора.
- •4.7. Тестирование атрибутного дмп-процессора
3 Описание этапа лексического анализа
На входе лексического анализатора находится последовательность символов представляющая программу на входном языке. Задача лексического анализатора состоит в разделении этой последовательности на слова языка (лексемы).
На этапе лексического анализатора решаются следующие задачи:
чтение исходной программы и выделение из нее лексем;
построение таблиц идентификаторов и констант;
преобразование входной программы (поток символов) в поток токенов, в котором каждый токен представляет лексему.
3.1. Определение типов лексем
Типы лексем, выделяемых лексическим анализатором из программы на входном языке, определяются входным языком. Обычно лексические анализаторы исключают из текста исходной программы комментарии, незначащие пробелы, символы табуляции и перевода строки и выделяют лексемы следующих типов:
идентификаторы;
константы (числовые, строковые, символьные);
ключевые слова входного языка;
знаки операций (арифметические, логические, отношения);
разделители.
Типы лексем запишем в виде таблицы (см. табл. 4).
Табл. 4.
Тип |
Лексемы |
Идентификаторы |
a, A, ...., z, Z |
Константы |
0, 1, ..., 9 |
Ключевые слова |
void, main, if, else, for, goto, cin<<, cout >>, or, and, not, vector, int, float, boolean |
Знаки операций |
+=, -=, =, *=, /=, +, -, *, /, ++, --, <, >, <=, >=, !=, ==, ~, |
Разделители |
, . ; : { } [ ] ? < > = + - |
Соотношения между токенами и лексемами для различных языковых конструкций иллюстрируется в табл. 5.
Табл. 5.
Токен |
Лексемы |
Языковая конструкция |
Ident |
Var, Label |
Идентификатор- последовательность символов, состоящая из букв и цифр, не начинающаяся с цифры. |
IF |
if |
Ключевое слово IF |
ELSE |
else |
Ключевое слово ELSE |
MAIN |
main |
Ключевое слово MAIN |
VOID |
void |
Ключевое слово VOID |
FOR |
for |
Ключевое слово FOR |
GOTO |
goto |
Ключевое слово GOTO |
CIN<< |
cin<< |
Ключевое слово CIN<< |
COUT>> |
cout>> |
Ключевое слово COUT>> |
OR |
or |
Ключевое слово OR |
AND |
and |
Ключевое слово AND |
NOT |
not |
Ключевое слово NOT |
CI |
NatNumber, Number, Dimension, Index |
Целочисленные константы |
CF |
FloatNumber |
Вещественные константы |
VEC |
Vector |
Вектор |
VECTOR |
vector |
Ключевое слово VECTOR |
TypeBase |
int, float, bool |
Базовые типы данных |
AssignRel |
+=, -=, *=, /=, = |
Отношение присваивания |
AddOperation |
+ , - |
Аддитивная операция (оператор типа «сложения») |
MultOperation |
*, / |
Мультипликативная операция (оператор типа «умножения») |
RelOperation |
< , > , <=, >=, ==, != |
Операция отношения |
UnaryOperation |
++, -- |
Унарная операция (оператор типа «сложения») |
( |
( |
Разделитель “(” |
) |
) |
Разделитель “)” |
[ |
[ |
Разделитель “[“ |
] |
] |
Разделитель “]” |
, |
, |
Разделитель “,” |
. |
. |
Разделитель ”.” |
; |
; |
Разделитель “;” |
{ |
{ |
Разделитель “{“ |
} |
} |
Разделитель “}” |
Separator |
:, ? |
Разделители для условного присваивания |
Тип «Ключевое слово»
Номер таблицы |
Индекс |
Значение |
0 |
0 |
void |
1 |
0 |
main |
2 |
0 |
if |
3 |
0 |
else |
4 |
0 |
for |
5 |
0 |
goto |
6 |
0 |
vector |
Тип «Оператор ввода-вывода»
Номер таблицы |
Индекс |
Значение |
7 |
0 |
cin<< |
|
1 |
cout>> |
Тип «Описатель»
Номер таблицы |
Индекс |
Значение |
8 |
0 |
int |
|
1 |
float |
|
2 |
bool |
Тип «Логическое отношение»
Номер таблицы |
Индекс |
Значение |
9 |
0 |
not |
10 |
0 |
and |
11 |
0 |
or |
Тип «Оператор присваивания»
Номер таблицы |
Индекс |
Значение |
12 |
0 |
+= |
13 |
0 |
-= |
14 |
0 |
*= |
15 |
0 |
/= |
16 |
0 |
= |
Тип «Бинарная операция»
Номер таблицы |
Индекс |
Значение |
17 |
0 |
+ |
|
1 |
- |
18 |
0 |
* |
|
1 |
/ |
Тип «Унарная операция»
Номер таблицы |
Индекс |
Значение |
19 |
0 |
++ |
20 |
0 |
-- |
Тип «Оператор длины»
Номер таблицы |
Индекс |
Значение |
21 |
0 |
~ |
Тип «Разделитель»
Номер таблицы |
Индекс |
Значение |
22 |
0 |
, |
|
1 |
. |
|
2 |
; |
|
3 |
: |
|
4 |
{ |
|
5 |
} |
|
6 |
[ |
|
7 |
] |
|
8 |
( |
|
9 |
) |
|
10 |
? |
Тип «Отношение»
Номер таблицы |
Индекс |
Значение |
23 |
0 |
< |
|
1 |
> |
|
2 |
<= |
|
3 |
>= |
|
4 |
== |
|
5 |
!= |
Тип «Идентификатор»
Номер таблицы |
Индекс |
Значение |
24 |
0 |
|
|
… |
|
|
n |
|
Тип «Целочисленная константа»
Номер таблицы |
Индекс |
Значение |
25 |
0 |
|
|
… |
|
|
m |
|
Тип «Вещественная константа» Тип «Метка»
Номер таблицы
Индекс
Значение
27
0
…
k
Номер таблицы
Индекс
Значение
26
0
…
m