- •1. Формальная постановка задачи Задание 10.
- •2. Описание входного языка
- •2.1. Синтаксис входного языка
- •2.2. Описание семантики входного языка
- •3 Описание этапа лексического анализа
- •3.1. Определение типов лексем
- •Определение синтаксиса лексем.
- •Построение диаграммы лексического анализатора.
- •Функции лексического анализатора
- •Описание этапа синтаксического анализа.
- •4.1. Построение кс-грамматики входного языка.
- •Разбиение исходной грамматики на подграмматики.
- •Описание промежуточного языка.
- •4.4. Неформальное описание перевода.
- •4.5. Посторенние атрибутной транслирующей грамматики.
- •4.6. Построение атрибутного дмп-процессора.
- •4.7. Тестирование атрибутного дмп-процессора
Описание этапа синтаксического анализа.
На этапе синтаксического анализа выполняются проверка синтаксической корректности исходной программы, представленной в виде потока токенов и совокупности таблиц, и преобразование её в некоторую внутреннюю форму, удобную в дальнейшем для генерации объектного кода.
Порядок действий, выполняемых при разработке синтаксического анализатора, следующий:
построение контекстно-свободной грамматики (КС-грамматики) входного языка;
разбиение построенной КС-грамматики на подграмматики;
описание промежуточного языка, используемого для представления программы после синтаксического анализа;
описание перевода конструкций входного языка в промежуточный язык;
построение транслирующей грамматики;
построение атрибутной транслирующей грамматики;
построение атрибутного детерминированного процессора с магазинной памятью (ДМП-процессора) для реализации перевода;
тестирование атрибутного ДМП-процессора.
4.1. Построение кс-грамматики входного языка.
Для построения КС-грамматики входного языка необходимо:
Заменить металингвистические переменные БНФ обозначениями нетерминальных символов, используя короткие имена.
В качестве терминальных символов использовать токены.
М
еталингвистический
символ «:=» заменить символом «
»Заменить одну металингвистическую формулу с n альтернативами на n правил грамматики с одинаковым символом в левой части правила вывода.
Исключить металингвистические символы [] и {}, включив в правила грамматики ε-правила и рекурсивные правила.
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
