Составители:
Рубрика:
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
- …
- следующая ›
- последняя »
