Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 95 стр.

UptoLike

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] =