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

UptoLike

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,”\\+|\\-”);
          {                                                                           }