Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2008-04-14-02-21-Наталья-.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
826 Кб
Скачать
☆
  1. Описание этапа синтаксического анализа.

На этапе синтаксического анализа выполняются проверка синтаксической корректности исходной программы, представленной в виде потока токенов и совокупности таблиц, и преобразование её в некоторую внутреннюю форму, удобную в дальнейшем для генерации объектного кода.

Порядок действий, выполняемых при разработке синтаксического анализатора, следующий:

  • построение контекстно-свободной грамматики (КС-грамматики) входного языка;

  • разбиение построенной КС-грамматики на подграмматики;

  • описание промежуточного языка, используемого для представления программы после синтаксического анализа;

  • описание перевода конструкций входного языка в промежуточный язык;

  • построение транслирующей грамматики;

  • построение атрибутной транслирующей грамматики;

  • построение атрибутного детерминированного процессора с магазинной памятью (ДМП-процессора) для реализации перевода;

  • тестирование атрибутного ДМП-процессора.

4.1. Построение кс-грамматики входного языка.

Для построения КС-грамматики входного языка необходимо:

              1. Заменить металингвистические переменные БНФ обозначениями нетерминальных символов, используя короткие имена.

              2. В качестве терминальных символов использовать токены.

              3. М еталингвистический символ «:=» заменить символом « »

              4. Заменить одну металингвистическую формулу с n альтернативами на n правил грамматики с одинаковым символом в левой части правила вывода.

              5. Исключить металингвистические символы [] и {}, включив в правила грамматики ε-правила и рекурсивные правила.

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