Составители:
Рубрика:
GenLogExpr[LogExpr1],
dup,
brfalse LABEL,
GenLogExpr[LogExpr2],
and,
LABEL: ;
GenLogExpr[LogExpr1 or LogExpr2] =
GenLogExpr[LogExpr1],
dup,
brtrue LABEL,
GenLogExpr[LogExpr2],
or,
LABEL: ;
GenLogExpr[not LogExpr] =
GenLogExpr[LogExpr],
not;
ComparisonOp[equal] = ceq;
ComparisonOp[less] = нужный вариант инструкции clt;
ComparisonOp[greater] = нужный вариант инструкции cgt;
Динамическая генерация кода
177
5.3.1.1. Абстрактный синтаксис логических выражений
Будем рассматривать логические выражения, которые содержат
арифметические выражения, рассмотренные в разделе 5.2.1, в качестве
подвыражений. Пусть также логические выражения содержат операции
сравнения (равно, меньше, больше) и логические операции (логическое
И, логическое ИЛИ, логическое НЕ).
Дополним абстрактный синтаксис выражений, приведенный ранее в
данной главе, новым нетерминалом LogExpr. Правила для этого нетерми-
нала приведены в таблице 5.4.
5.3.1.2. Отображение абстрактного синтаксиса логических выражений в CIL
Аналогично функциям GenExpr из раздела 5.2.1.2, определим набор
функций GenLogExpr, которые отображают деревья абстрактного синтак-
сиса, соответствующие логическим выражениям, в CIL.
Напомним, что каждая функция принимает в качестве параметра
дерево абстрактного синтаксиса и возвращает последовательность инст-
рукций:
GenLogExpr[Expr] = GenExpr[Expr];
GenLogExpr[LogExpr1 ComparisonOp LogExpr2] =
GenLogExpr[LogExpr1],
GenLogExpr[LogExpr2],
GenComparisonOp[ComparisonOp];
GenLogExpr[LogExpr1 and LogExpr2] =
176
CIL и системное программирование в Microsoft .NET
a) b) c) d) e)
Рис. 5.2. Структурные конструкции
Правило Описание
LogExpr ::= Expr Вырожденный случай, когда логи-
ческое выражение не содержит ни
одной логической операции или
операции сравнения
LogExpr ::= LogExpr Сравнение двух выражений
ComparisonOp LogExpr
LogExpr ::= LogExpr Применение логического И
and LogExpr
LogExpr ::= LogExpr Применение логического ИЛИ
or LogExpr
LogExpr ::= not LogExpr Применение логического НЕ
ComparisonOp ::= equal Равенство
ComparisonOp ::= less Меньше
ComparisonOp ::= greater Больше
Таблица 5.4. Абстрактный синтаксис логических выражений
176 CIL и системное программирование в Microsoft .NET Динамическая генерация кода 177 a) b) c) d) e) Таблица 5.4. Абстрактный синтаксис логических выражений Правило Описание LogExpr ::= Expr Вырожденный случай, когда логи- ческое выражение не содержит ни одной логической операции или операции сравнения LogExpr ::= LogExpr Сравнение двух выражений ComparisonOp LogExpr LogExpr ::= LogExpr Применение логического И and LogExpr LogExpr ::= LogExpr Применение логического ИЛИ or LogExpr LogExpr ::= not LogExpr Применение логического НЕ ComparisonOp ::= equal Равенство ComparisonOp ::= less Меньше Рис. 5.2. Структурные конструкции ComparisonOp ::= greater Больше 5.3.1.1. Абстрактный синтаксис логических выражений Будем рассматривать логические выражения, которые содержат арифметические выражения, рассмотренные в разделе 5.2.1, в качестве GenLogExpr[LogExpr1], подвыражений. Пусть также логические выражения содержат операции dup, сравнения (равно, меньше, больше) и логические операции (логическое brfalse LABEL, И, логическое ИЛИ, логическое НЕ). GenLogExpr[LogExpr2], Дополним абстрактный синтаксис выражений, приведенный ранее в and, данной главе, новым нетерминалом LogExpr. Правила для этого нетерми- LABEL: ; нала приведены в таблице 5.4. GenLogExpr[LogExpr1 or LogExpr2] = GenLogExpr[LogExpr1], 5.3.1.2. Отображение абстрактного синтаксиса логических выражений в CIL dup, Аналогично функциям GenExpr из раздела 5.2.1.2, определим набор brtrue LABEL, функций GenLogExpr, которые отображают деревья абстрактного синтак- GenLogExpr[LogExpr2], сиса, соответствующие логическим выражениям, в CIL. or, Напомним, что каждая функция принимает в качестве параметра LABEL: ; дерево абстрактного синтаксиса и возвращает последовательность инст- GenLogExpr[not LogExpr] = рукций: GenLogExpr[LogExpr], GenLogExpr[Expr] = GenExpr[Expr]; not; GenLogExpr[LogExpr1 ComparisonOp LogExpr2] = ComparisonOp[equal] = ceq; GenLogExpr[LogExpr1], ComparisonOp[less] = нужный вариант инструкции clt; GenLogExpr[LogExpr2], ComparisonOp[greater] = нужный вариант инструкции cgt; GenComparisonOp[ComparisonOp]; GenLogExpr[LogExpr1 and LogExpr2] =
Страницы
- « первая
- ‹ предыдущая
- …
- 93
- 94
- 95
- 96
- 97
- …
- следующая ›
- последняя »