- •Пояснительная записка
- •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.2 Функции лексического анализатора
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 – пишет в выходной поток конкретную унарную операцию.
3.3 Тестирование лексического анализатора
Пусть на вход тестируемого лексического анализатора подана следующая входная цепочка:
В ходе разбора указанной цепочки будут созданы таблица идентификаторов вида
0 |
a |
1 |
b |
2 |
c |
таблица целочисленных констант
0 |
5 |
1 |
3 |
2 |
1 |
таблица вещественных констант
0 |
2.0 |
1 |
4.1 |
Исходная программа будет выглядеть как
№ таблицы |
Индекс |
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 |
На выходе лексического анализатора программа будет представлена потоком токенов
VOID
MAIN
(
)
{
TypeBase
Ident
;
Ident
AssignRel
CI
;
VECTOR
Ident
[
CI
]
;
Ident
=
[
CF
,
CF
,
CF
]
;
IF
(
CF
RelOperation
Ident
)
COUT>>
Ident
;
}
4 Описание этапа синтаксического анализа
На этапе синтаксического анализа выполняется проверка синтаксической корректности исходной программы, представленной в виде потока токенов и совокупности таблиц, и преобразование её в некоторую внутреннюю форму, удобную в дальнейшем для генерации объектного кода.
4.1 Исходная порождающая кс-грамматика
P – начальный нетерминальный символ.
P → void main() { DeclarVar DeclarVector CompositeOperator }
DeclarVar → TypeBase Ident DeclarVar;
DeclarVar →
DeclarVector → vector Ident [Dimension] DeclarVector
DeclarVector →
CompositeOperator →{ SeqOperator}
SeqOperator → Operator ; SeqOperator
SeqOperator →
Operator → [Label]: NonMarkedOperator
Operator → NonMarkedOperator
NonMarkedOperator → CompositeOperator
NonMarkedOperator → AssignOperator
NonMarkedOperator → ConAssignOperator
NonMarkedOperator → ConditionOperator
NonMarkedOperator → LoopOperator
NonMarkedOperator → GotoOperator
NonMarkedOperator → InputOperator
NonMarkedOperator → OutputOperator
ConAssignOperator → ( Logical Expr ) ? Expr : Expr
AssignOperator → Var AssignRel Expr
ConditionOperator → if ( LogicalExpr ) CompositeOperator
ConditionOperator → if ( LogicalExpr ) CompositeOperator else CompositeOperator
LoopOperator → for( AssignOperator ; LogicalExpr; AssignOperator) CompositeOperator
GotoOperator → goto Label
InputOperator → cin>>Var
OutputOperator → cout<< Var
Expr → Expr AddOperation Item
Expr → Item
Expr → Item UnaryOperation
Expr → ~ Vector
Item → Item MultOoperation Factor
Item →Factor
Factor → Var
Factor → ( Expr )
LogicalExpr → Con or Con
LogicalExpr → Relation
Con → LogicalFactor and LogicalFactor
LogicalFactor → ( LogicalExpr )
LogicalFactor → (Relation)
LogicalFactor →not LogicalFactor
Relation →Expr RelOperation Expr
Var → Ident
Var → Vector
Label → Ident
Number →0
Number → NatNumber
NNumber → Number NNumber
NNumber →
Dimension → NatNumber
Dimension → NatNumber NNumber
Index → 0
Index → NatNumber Index
Vector → Ident
Vector → [ VectorElem NVectorElem ]
NVectorElem → , VectorElem
NVectorElem →
VectorElem →Ident [ Index]
VectorElem → Ident
VectorElem → FloatNumber
FloatNumber → NatNumber NNumber . NNumber