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

UptoLike

public override void GenerateCIL(ILGenerator il)
{
a.GenerateCIL(il);
il.Emit(OpCodes.Neg);
}
public override double Evaluate(double x)
{
return -a.Evaluate(x);
}
}
class BinaryExpression: Expression
{
private Expression a, b;
private OpCode op;
public BinaryExpression(Expression a, Expression b, OpCode op)
{
this.a = a;
this.b = b;
this.op = op;
}
private string opCs()
{
if (op.Equals(OpCodes.Add))
return “+”;
else if (op.Equals(OpCodes.Sub))
return “-”;
else if (op.Equals(OpCodes.Mul))
return “*”;
else
return “/”;
}
public override string GenerateCS()
{
return “(“+a.GenerateCS()+”)”+opCs()+”(“+b.GenerateCS()+”)”;
}
public override void GenerateCIL(ILGenerator il)
Исходный код программы Integral
303
Приложение B.
Исходный код программы Integral
Исходный код программы Integral, демонстрирующей различные
способы динамической генерации кода на примере вычисления опреде-
ленного интеграла, состоит из двух файлов:
Expr.cs
Содержит парсер арифметических выражений и классы для де-
рева абстрактного синтаксиса.
Integral.cs
Содержит классы для динамической генерации кода и вычисле-
ния интеграла.
B.1. Expr.cs
using System;
using System.Globalization;
using System.Reflection.Emit;
using System.Text.RegularExpressions;
public abstract class Expression
{
public abstract string GenerateCS();
public abstract void GenerateCIL(ILGenerator il);
public abstract double Evaluate(double x);
}
class UnaryExpression: Expression
{
private Expression a;
public UnaryExpression(Expression a) { this.a = a; }
public override string GenerateCS()
{
return “-(“+a.GenerateCS()+”)”;
}
302
CIL и системное программирование в Microsoft .NET
302                           CIL и системное программирование в Microsoft .NET   Исходный код программы Integral                                       303


                                                                                           public override void GenerateCIL(ILGenerator il)
Приложение B.                                                                              {
                                                                                              a.GenerateCIL(il);
Исходный код программы Integral                                                               il.Emit(OpCodes.Neg);
                                                                                           }
    Исходный код программы Integral, демонстрирующей различные
способы динамической генерации кода на примере вычисления опреде-                          public override double Evaluate(double x)
ленного интеграла, состоит из двух файлов:                                                 {
       • Expr.cs                                                                              return -a.Evaluate(x);
         Содержит парсер арифметических выражений и классы для де-                         }
         рева абстрактного синтаксиса.                                                 }
       • Integral.cs
         Содержит классы для динамической генерации кода и вычисле-                    class BinaryExpression: Expression
         ния интеграла.                                                                {
                                                                                         private Expression a, b;
                                                                                         private OpCode op;
B.1. Expr.cs
                                                                                           public BinaryExpression(Expression a, Expression b, OpCode op)
                                                                                           {
      using   System;                                                                         this.a = a;
      using   System.Globalization;                                                           this.b = b;
      using   System.Reflection.Emit;                                                         this.op = op;
      using   System.Text.RegularExpressions;                                              }

      public abstract class Expression                                                     private string opCs()
      {                                                                                    {
        public abstract string GenerateCS();                                                  if (op.Equals(OpCodes.Add))
        public abstract void GenerateCIL(ILGenerator il);                                        return “+”;
        public abstract double Evaluate(double x);                                            else if (op.Equals(OpCodes.Sub))
      }                                                                                          return “-”;
                                                                                              else if (op.Equals(OpCodes.Mul))
      class UnaryExpression: Expression                                                          return “*”;
      {                                                                                       else
        private Expression a;                                                                    return “/”;
                                                                                           }
       public UnaryExpression(Expression a) { this.a = a; }
                                                                                           public override string GenerateCS()
       public override string GenerateCS()                                                 {
       {                                                                                      return “(“+a.GenerateCS()+”)”+opCs()+”(“+b.GenerateCS()+”)”;
          return “-(“+a.GenerateCS()+”)”;                                                  }
       }
                                                                                           public override void GenerateCIL(ILGenerator il)