Составители:
Рубрика:
{
public VariableExpression() { }
public override string GenerateCS()
{
return “x”;
}
public override void GenerateCIL(ILGenerator il)
{
il.Emit(OpCodes.Ldarg_1);
}
public override double Evaluate(double x)
{
return x;
}
}
public class Parser
{
private const string REGEXP_NUMBER = “[0-9]+(.[0-9])?”;
private Match token;
public Parser(string expr)
{
token = Regex.Match(expr,
“x|” + // identifier x
REGEXP_NUMBER+”|”+ // floating-point numbers
“\\+|\\-|\\*|/|”+ // arithmetic operators
“\\(|\\)” // parens
);
}
public Expression Parse()
{
checkToken();
Expression result = null;
OpCode op = OpCodes.Add;
if (isAddOp())
Исходный код программы Integral
305
{
a.GenerateCIL(il);
b.GenerateCIL(il);
il.Emit(op);
}
public override double Evaluate(double x)
{
if (op.Equals(OpCodes.Add))
return a.Evaluate(x) + b.Evaluate(x);
else if (op.Equals(OpCodes.Sub))
return a.Evaluate(x) – b.Evaluate(x);
else if (op.Equals(OpCodes.Mul))
return a.Evaluate(x) * b.Evaluate(x);
else
return a.Evaluate(x) / b.Evaluate(x);
}
}
class ConstExpression: Expression
{
private double value;
public ConstExpression(double value) { this.value = value; }
public override string GenerateCS()
{
return value.ToString(new CultureInfo(“”));
}
public override void GenerateCIL(ILGenerator il)
{
il.Emit(OpCodes.Ldc_R8,value);
}
public override double Evaluate(double x)
{
return value;
}
}
class VariableExpression: Expression
304
CIL и системное программирование в Microsoft .NET
304 CIL и системное программирование в Microsoft .NET Исходный код программы Integral 305 { { a.GenerateCIL(il); public VariableExpression() { } b.GenerateCIL(il); il.Emit(op); public override string GenerateCS() } { return “x”; public override double Evaluate(double x) } { if (op.Equals(OpCodes.Add)) public override void GenerateCIL(ILGenerator il) return a.Evaluate(x) + b.Evaluate(x); { else if (op.Equals(OpCodes.Sub)) il.Emit(OpCodes.Ldarg_1); return a.Evaluate(x) – b.Evaluate(x); } else if (op.Equals(OpCodes.Mul)) return a.Evaluate(x) * b.Evaluate(x); public override double Evaluate(double x) else { return a.Evaluate(x) / b.Evaluate(x); return x; } } } } class ConstExpression: Expression public class Parser { { private double value; private const string REGEXP_NUMBER = “[0-9]+(.[0-9])?”; private Match token; public ConstExpression(double value) { this.value = value; } public Parser(string expr) public override string GenerateCS() { { return value.ToString(new CultureInfo(“”)); token = Regex.Match(expr, } “x|” + // identifier x REGEXP_NUMBER+”|”+ // floating-point numbers public override void GenerateCIL(ILGenerator il) “\\+|\\-|\\*|/|”+ // arithmetic operators { “\\(|\\)” // parens il.Emit(OpCodes.Ldc_R8,value); ); } } public override double Evaluate(double x) public Expression Parse() { { return value; checkToken(); } Expression result = null; } OpCode op = OpCodes.Add; class VariableExpression: Expression if (isAddOp())
Страницы
- « первая
- ‹ предыдущая
- …
- 157
- 158
- 159
- 160
- 161
- …
- следующая ›
- последняя »