- •Пояснительная записка
- •1 Формальная постановка задачи
- •2 Описание входного языка
- •2.1. Синтаксис входного языка
- •2.2. Семантика входного языка
- •2.2.1.Встроенные типы данных входного языка
- •2.2.2.Операции входного языка и их приоритет
- •2.2.3.Конструкции входного языка
- •3 Описание этапа лексического анализа
- •3.1 Описание типов лексем
- •3.2 Функции лексического анализатора
- •3.3 Тестирование лексического анализатора
- •4 Описание этапа синтаксического анализа
- •4.1 Исходная порождающая кс-грамматика
- •4.2 Разбиение исходной грамматики на подграмматики
- •4.3. Разработка дмп-процессора, порожденного исходной грамматикой
- •4.3.1 Алгоритм разбора для ll(1)-грамматик
- •4.3.2 Взаимодействие дмп-процессоров
- •4.3.3 Алгоритм работы дмп-процессора
- •4.3.4 Управляющие таблицы дмп-процессоров
- •4.3. Описание перевода во внутренний язык
- •4.3.1 Формат тетрады
- •4.3.2 Формат тетрад для представления основных операторов
- •4.3.3 Представление основных операторов(описанных в разделе семантики) с помощью тетрад
- •4.4.4 Взаимодействие атг с имеющимися таблицами лексического анализатора
- •4.4.5 Разработка атрибутной транслирующей грамматики
- •4.4.6 Описание используемых операционных символов
- •4.4.7 Атрибутный перевод дляLl(1)-грамматик
- •4.4.8 Атрибутный дмп-процессор
- •4.4.9 Тестовый пример
- •Список литературы
- •Приложение 1 Тестирование дмп-процессора
3.1 Описание типов лексем
На этапе лексического анализа решаются следующие задачи:
Чтение исходной программы и выделение из нее лексем
Построение таблиц идентификаторов и констант
Преобразование входной программы (поток литер) в поток токенов, в котором каждый токен представляет лексему.
Если в исходной программе при записи лексем были допущены ошибки, лексический анализатор для каждой ошибки должен локализовать место ошибки и выдать пользователю сообщение об ошибке.
Лексический анализ проводится без учета регистра символа.
Так как синтаксисом разрабатываемого языка не предусмотрены комментарии, то все символы, встречающиеся при лексическом анализе, относятся к основному тексту программы.
При лексическом анализе будем выделять следующие типы лексем:
Тип лексемы |
Описание |
Ключевое слово |
void main if else for goto cin<< cout >> or and not vector |
Описатель |
int float bool |
Разделитель |
, . ; : { } [ ] ? |
Натуральное число |
Последовательность символов, состоящая только из цифр и не начинающаяся с нуля. |
Оператор |
+= -= *= = *= /= + - * / ++ -- < > <= >= != == ~ |
Идентификатор |
Последовательность символов, состоящая из букв и цифр, не начинающаяся с цифры. |
Индекс |
Значение |
|
|
|
|
Индекс |
Значение |
|
|
|
|
Таблица ключевых слов Таблица описателей
Индекс |
Значение |
|
|
|
|
Таблица разделителей Таблица констант
Индекс |
Значение |
|
|
|
|
Таблица операторов Таблица идентификаторов
Индекс |
Значение |
|
|
|
|
Индекс |
Значение |
|
|
|
|
Определим типы токенов, которые мы можем получить на выходе лексического анализатора.
Токен |
Лексемы |
Языковая конструкция |
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 |
|
Тип «Вещественная константа»
Номер таблицы |
Индекс |
Значение |
26 |
0 |
|
|
… |
|
|
m |
|
Тип «Метка»
Номер таблицы |
Индекс |
Значение |
27 |
0 |
|
|
… |
|
|
k |
|