Рабочим названием платформы .NET было |
Опубликован: 28.06.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный технический университет им. Н.Э. Баумана
Лекция 10:
Динамическая генерация кода
Генерация кода для управляющих конструкций
Воспользовавшись уже отработанной схемой генерации кода, перейдем на уровень выше и рассмотрим генерацию основных структурных управляющих конструкций.
Абстрактный синтаксис управляющих конструкций
В таблице 5.5 приведен абстрактный синтаксис для последовательности, выбора и циклов с предусловием и постусловием. При записи абстрактного синтаксиса используется определенный ранее нетерминал LogExpr для представления условий выбора и циклов.
Отображение абстрактного синтаксиса управляющих конструкций в 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[пусто] = ;