Составители:
Рубрика:
IFormatProvider provider = new CultureInfo(“”);
double val = Convert.ToDouble(token.Value,provider);
result = new ConstExpression(val);
}
else if (token.Value.Equals(“x”))
result = new VariableExpression();
else if (token.Value.Equals(“(“))
{
token = token.NextMatch();
result = Parse();
if (! token.Value.Equals(“)”))
throwError();
}
else
throwError();
token = token.NextMatch();
return result;
}
private void checkToken()
{
if (!token.Success)
throwError();
}
private void throwError()
{
throw new Exception(“syntax error”);
}
private bool isNumber()
{
return Regex.IsMatch(token.Value,REGEXP_NUMBER);
}
private bool isAddOp()
{
return Regex.IsMatch(token.Value,”\\+|\\-”);
}
Исходный код программы Integral
307
{
op = token.Value.Equals(“-”) ? OpCodes.Sub : OpCodes.Add;
token = token.NextMatch();
}
result = parseTerm();
if (op.Equals(OpCodes.Sub))
result = new UnaryExpression(result);
while (token.Success && isAddOp())
{
op = token.Value.Equals(“-”) ? OpCodes.Sub : OpCodes.Add;
token = token.NextMatch();
result = new BinaryExpression(result,parseTerm(),op);
}
return result;
}
private Expression parseTerm()
{
checkToken();
Expression result = parseFactor();
while (token.Success && isMulOp())
{
OpCode op = token.Value.Equals(“*”) ?
OpCodes.Mul : OpCodes.Div;
token = token.NextMatch();
result = new BinaryExpression(result,parseFactor(),op);
}
return result;
}
private Expression parseFactor()
{
checkToken();
Expression result = null;
if (isNumber())
{
306
CIL и системное программирование в Microsoft .NET
306 CIL и системное программирование в Microsoft .NET Исходный код программы Integral 307
{ IFormatProvider provider = new CultureInfo(“”);
op = token.Value.Equals(“-”) ? OpCodes.Sub : OpCodes.Add; double val = Convert.ToDouble(token.Value,provider);
token = token.NextMatch(); result = new ConstExpression(val);
} }
else if (token.Value.Equals(“x”))
result = parseTerm(); result = new VariableExpression();
if (op.Equals(OpCodes.Sub)) else if (token.Value.Equals(“(“))
result = new UnaryExpression(result); {
token = token.NextMatch();
while (token.Success && isAddOp()) result = Parse();
{
op = token.Value.Equals(“-”) ? OpCodes.Sub : OpCodes.Add; if (! token.Value.Equals(“)”))
token = token.NextMatch(); throwError();
result = new BinaryExpression(result,parseTerm(),op); }
} else
throwError();
return result;
} token = token.NextMatch();
private Expression parseTerm() return result;
{ }
checkToken();
Expression result = parseFactor(); private void checkToken()
{
while (token.Success && isMulOp()) if (!token.Success)
{ throwError();
OpCode op = token.Value.Equals(“*”) ? }
OpCodes.Mul : OpCodes.Div;
token = token.NextMatch(); private void throwError()
result = new BinaryExpression(result,parseFactor(),op); {
} throw new Exception(“syntax error”);
}
return result;
} private bool isNumber()
{
private Expression parseFactor() return Regex.IsMatch(token.Value,REGEXP_NUMBER);
{ }
checkToken();
Expression result = null; private bool isAddOp()
{
if (isNumber()) return Regex.IsMatch(token.Value,”\\+|\\-”);
{ }
Страницы
- « первая
- ‹ предыдущая
- …
- 158
- 159
- 160
- 161
- 162
- …
- следующая ›
- последняя »
