Опубликован: 28.06.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный технический университет им. Н.Э. Баумана
Лекция 10:

Динамическая генерация кода

Генерация кода для управляющих конструкций

Воспользовавшись уже отработанной схемой генерации кода, перейдем на уровень выше и рассмотрим генерацию основных структурных управляющих конструкций.

Абстрактный синтаксис управляющих конструкций

В таблице 5.5 приведен абстрактный синтаксис для последовательности, выбора и циклов с предусловием и постусловием. При записи абстрактного синтаксиса используется определенный ранее нетерминал LogExpr для представления условий выбора и циклов.

Таблица 5.5. Абстрактный синтаксис управляющих конструкций
Правило Описание
Statement ::= Expr
Предложение является выражением. Это может быть, например, выражение, содержащее операцию присваивания или вызов метода объекта
Statement ::= if LogExpr
  StatementList else
  StatementList
Выбор с двумя альтернативами
Statement ::= while
 LogExpr StatementList
Цикл с предусловием
Statement ::= do
 StatementList
 while LogExpr
Цикл с постусловием
Statement ::=
 Statement StatementList
Непустая последовательность предложений
StatementList ::= пусто
Пустая последовательность предложений
Отображение абстрактного синтаксиса управляющих конструкций в CIL

Как уже говорилось, структурные управляющие конструкции допускают рекурсивный алгоритм генерации. Поэтому мы можем определить набор функций GenStatement, транслирующих деревья абстрактного синтаксиса в последовательности инструкций.

GenStatement[Expr] =
  GenExpr[Expr],
  pop;
GenStatement[if LogExpr StatementList1 else StatementList2] =
  GenLogExpr[LogExpr],
  brfalse LABEL1,
  GenStatementList[StatementList1],
  br LABEL2,
  LABEL1: GenStatementList[StatementList2],
  LABEL2: ;
GenStatement[while LogExpr StatementList] =
  LABEL1: GenLogExpr[LogExpr],
  brfalse LABEL2,
  GenStatementList[StatementList],
  br LABEL1,
  LABEL2: ;
GenStatement[do StatementList while LogExpr] =
  LABEL: GenStatementList[StatementList],
  GenLogExpr[LogExpr],
  brtrue LABEL;
GenStatementList[Statement StatementList] =
  GenStatement[Statement],
  GenStatementList[StatementList];
GenStatementList[пусто] = ;
Анастасия Булинкова
Анастасия Булинкова
Рабочим названием платформы .NET было
Bogdan Drumov
Bogdan Drumov
Молдова, Республика
Azamat Nurmanbetov
Azamat Nurmanbetov
Киргизия, Bishkek