Московский государственный технический университет им. Н.Э. Баумана
Опубликован: 28.06.2006 | Доступ: свободный | Студентов: 12463 / 341 | Оценка: 4.54 / 3.83 | Длительность: 22:03:00
ISBN: 978-5-9556-0055-0
Лекция 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 было