Составители:
Рубрика:
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)
Страницы
- « первая
- ‹ предыдущая
- …
- 156
- 157
- 158
- 159
- 160
- …
- следующая ›
- последняя »