<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FC_Sharp%2FDevelopment_Class%2FParser</id>
		<title>Csharp/C Sharp/Development Class/Parser - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FC_Sharp%2FDevelopment_Class%2FParser"/>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/C_Sharp/Development_Class/Parser&amp;action=history"/>
		<updated>2026-04-30T02:31:17Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/C_Sharp/Development_Class/Parser&amp;diff=1236&amp;oldid=prev</id>
		<title> в 15:31, 26 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/C_Sharp/Development_Class/Parser&amp;diff=1236&amp;oldid=prev"/>
				<updated>2010-05-26T15:31:19Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 15:31, 26 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/C_Sharp/Development_Class/Parser&amp;diff=1237&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/C_Sharp/Development_Class/Parser&amp;diff=1237&amp;oldid=prev"/>
				<updated>2010-05-26T11:45:24Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==This module contains the recursive descent     parser that does not use variables==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
/*  &lt;br /&gt;
   This module contains the recursive descent &lt;br /&gt;
   parser that does not use variables. &lt;br /&gt;
*/ &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
// Exception class for parser errors. &lt;br /&gt;
class ParserException : ApplicationException { &lt;br /&gt;
  public ParserException(string str) : base(str) { }  &lt;br /&gt;
 &lt;br /&gt;
  public override string ToString() { &lt;br /&gt;
    return Message; &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
class Parser { &lt;br /&gt;
  // Enumerate token types. &lt;br /&gt;
  enum Types { NONE, DELIMITER, VARIABLE, NUMBER }; &lt;br /&gt;
  // Enumerate error types. &lt;br /&gt;
  enum Errors { SYNTAX, UNBALPARENS, NOEXP, DIVBYZERO }; &lt;br /&gt;
 &lt;br /&gt;
  string exp;    // refers to expression string &lt;br /&gt;
  int expIdx;    // current index into the expression &lt;br /&gt;
  string token;  // holds current token &lt;br /&gt;
  Types tokType; // holds token&amp;quot;s type &lt;br /&gt;
 &lt;br /&gt;
  // Parser entry point. &lt;br /&gt;
  public double Evaluate(string expstr) &lt;br /&gt;
  { &lt;br /&gt;
    double result; &lt;br /&gt;
   &lt;br /&gt;
    exp = expstr; &lt;br /&gt;
    expIdx = 0;  &lt;br /&gt;
  &lt;br /&gt;
    try {  &lt;br /&gt;
      GetToken(); &lt;br /&gt;
      if(token == &amp;quot;&amp;quot;) { &lt;br /&gt;
        SyntaxErr(Errors.NOEXP); // no expression present &lt;br /&gt;
        return 0.0; &lt;br /&gt;
      } &lt;br /&gt;
 &lt;br /&gt;
      EvalExp2(out result); &lt;br /&gt;
 &lt;br /&gt;
      if(token != &amp;quot;&amp;quot;) // last token must be null &lt;br /&gt;
        SyntaxErr(Errors.SYNTAX); &lt;br /&gt;
 &lt;br /&gt;
      return result; &lt;br /&gt;
    } catch (ParserException exc) { &lt;br /&gt;
      // Add other error handling here, as desired. &lt;br /&gt;
      Console.WriteLine(exc); &lt;br /&gt;
      return 0.0; &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Add or subtract two terms. &lt;br /&gt;
  void EvalExp2(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    string op; &lt;br /&gt;
    double partialResult; &lt;br /&gt;
   &lt;br /&gt;
    EvalExp3(out result); &lt;br /&gt;
    while((op = token) == &amp;quot;+&amp;quot; || op == &amp;quot;-&amp;quot;) { &lt;br /&gt;
      GetToken(); &lt;br /&gt;
      EvalExp3(out partialResult); &lt;br /&gt;
      switch(op) { &lt;br /&gt;
        case &amp;quot;-&amp;quot;: &lt;br /&gt;
          result = result - partialResult; &lt;br /&gt;
          break; &lt;br /&gt;
        case &amp;quot;+&amp;quot;: &lt;br /&gt;
          result = result + partialResult; &lt;br /&gt;
          break; &lt;br /&gt;
      } &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Multiply or divide two factors. &lt;br /&gt;
  void EvalExp3(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    string op; &lt;br /&gt;
    double partialResult = 0.0; &lt;br /&gt;
   &lt;br /&gt;
    EvalExp4(out result); &lt;br /&gt;
    while((op = token) == &amp;quot;*&amp;quot; || &lt;br /&gt;
           op == &amp;quot;/&amp;quot; || op == &amp;quot;%&amp;quot;) { &lt;br /&gt;
      GetToken(); &lt;br /&gt;
      EvalExp4(out partialResult); &lt;br /&gt;
      switch(op) { &lt;br /&gt;
        case &amp;quot;*&amp;quot;: &lt;br /&gt;
          result = result * partialResult; &lt;br /&gt;
          break; &lt;br /&gt;
        case &amp;quot;/&amp;quot;: &lt;br /&gt;
          if(partialResult == 0.0) &lt;br /&gt;
            SyntaxErr(Errors.DIVBYZERO); &lt;br /&gt;
          result = result / partialResult; &lt;br /&gt;
          break; &lt;br /&gt;
        case &amp;quot;%&amp;quot;: &lt;br /&gt;
          if(partialResult == 0.0) &lt;br /&gt;
            SyntaxErr(Errors.DIVBYZERO); &lt;br /&gt;
          result = (int) result % (int) partialResult; &lt;br /&gt;
          break; &lt;br /&gt;
      } &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Process an exponent. &lt;br /&gt;
  void EvalExp4(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    double partialResult, ex; &lt;br /&gt;
    int t; &lt;br /&gt;
   &lt;br /&gt;
    EvalExp5(out result); &lt;br /&gt;
    if(token == &amp;quot;^&amp;quot;) { &lt;br /&gt;
      GetToken(); &lt;br /&gt;
      EvalExp4(out partialResult); &lt;br /&gt;
      ex = result; &lt;br /&gt;
      if(partialResult == 0.0) { &lt;br /&gt;
        result = 1.0; &lt;br /&gt;
        return; &lt;br /&gt;
      } &lt;br /&gt;
      for(t=(int)partialResult-1; t &amp;gt; 0; t--) &lt;br /&gt;
        result = result * (double)ex; &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Evaluate a unary + or -. &lt;br /&gt;
  void EvalExp5(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    string  op; &lt;br /&gt;
   &lt;br /&gt;
    op = &amp;quot;&amp;quot;; &lt;br /&gt;
    if((tokType == Types.DELIMITER) &amp;amp;&amp;amp; &lt;br /&gt;
        token == &amp;quot;+&amp;quot; || token == &amp;quot;-&amp;quot;) { &lt;br /&gt;
      op = token; &lt;br /&gt;
      GetToken(); &lt;br /&gt;
    } &lt;br /&gt;
    EvalExp6(out result); &lt;br /&gt;
    if(op == &amp;quot;-&amp;quot;) result = -result; &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Process a parenthesized expression. &lt;br /&gt;
  void EvalExp6(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    if((token == &amp;quot;(&amp;quot;)) { &lt;br /&gt;
      GetToken(); &lt;br /&gt;
      EvalExp2(out result); &lt;br /&gt;
      if(token != &amp;quot;)&amp;quot;) &lt;br /&gt;
        SyntaxErr(Errors.UNBALPARENS); &lt;br /&gt;
      GetToken(); &lt;br /&gt;
    } &lt;br /&gt;
    else Atom(out result); &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Get the value of a number. &lt;br /&gt;
  void Atom(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    switch(tokType) { &lt;br /&gt;
      case Types.NUMBER: &lt;br /&gt;
        try { &lt;br /&gt;
          result = Double.Parse(token); &lt;br /&gt;
        } catch (FormatException) { &lt;br /&gt;
          result = 0.0; &lt;br /&gt;
          SyntaxErr(Errors.SYNTAX); &lt;br /&gt;
        } &lt;br /&gt;
        GetToken(); &lt;br /&gt;
        return; &lt;br /&gt;
      default: &lt;br /&gt;
        result = 0.0; &lt;br /&gt;
        SyntaxErr(Errors.SYNTAX); &lt;br /&gt;
        break; &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Handle a syntax error. &lt;br /&gt;
  void SyntaxErr(Errors error) &lt;br /&gt;
  { &lt;br /&gt;
    string[] err = { &lt;br /&gt;
      &amp;quot;Syntax Error&amp;quot;, &lt;br /&gt;
      &amp;quot;Unbalanced Parentheses&amp;quot;, &lt;br /&gt;
      &amp;quot;No Expression Present&amp;quot;, &lt;br /&gt;
      &amp;quot;Division by Zero&amp;quot; &lt;br /&gt;
    }; &lt;br /&gt;
 &lt;br /&gt;
    throw new ParserException(err[(int)error]); &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Obtain the next token. &lt;br /&gt;
  void GetToken() &lt;br /&gt;
  { &lt;br /&gt;
    tokType = Types.NONE; &lt;br /&gt;
    token = &amp;quot;&amp;quot;; &lt;br /&gt;
    &lt;br /&gt;
    if(expIdx == exp.Length) return; // at end of expression &lt;br /&gt;
   &lt;br /&gt;
    // skip over white space &lt;br /&gt;
    while(expIdx &amp;lt; exp.Length &amp;amp;&amp;amp; &lt;br /&gt;
          Char.IsWhiteSpace(exp[expIdx])) ++expIdx; &lt;br /&gt;
 &lt;br /&gt;
    // trailing whitespace ends expression &lt;br /&gt;
    if(expIdx == exp.Length) return; &lt;br /&gt;
 &lt;br /&gt;
    if(IsDelim(exp[expIdx])) { // is operator &lt;br /&gt;
      token += exp[expIdx]; &lt;br /&gt;
      expIdx++; &lt;br /&gt;
      tokType = Types.DELIMITER; &lt;br /&gt;
    } &lt;br /&gt;
    else if(Char.IsLetter(exp[expIdx])) { // is variable &lt;br /&gt;
      while(!IsDelim(exp[expIdx])) { &lt;br /&gt;
        token += exp[expIdx]; &lt;br /&gt;
        expIdx++; &lt;br /&gt;
        if(expIdx &amp;gt;= exp.Length) break; &lt;br /&gt;
      } &lt;br /&gt;
      tokType = Types.VARIABLE; &lt;br /&gt;
    } &lt;br /&gt;
    else if(Char.IsDigit(exp[expIdx])) { // is number &lt;br /&gt;
      while(!IsDelim(exp[expIdx])) { &lt;br /&gt;
        token += exp[expIdx]; &lt;br /&gt;
        expIdx++; &lt;br /&gt;
        if(expIdx &amp;gt;= exp.Length) break; &lt;br /&gt;
      } &lt;br /&gt;
      tokType = Types.NUMBER; &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Return true if c is a delimiter. &lt;br /&gt;
  bool IsDelim(char c) &lt;br /&gt;
  { &lt;br /&gt;
    if((&amp;quot; +-/*%^=()&amp;quot;.IndexOf(c) != -1)) &lt;br /&gt;
      return true; &lt;br /&gt;
    return false; &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Demonstrate the parser. &lt;br /&gt;
 &lt;br /&gt;
public class ParserDemo { &lt;br /&gt;
  public static void Main() &lt;br /&gt;
  { &lt;br /&gt;
    string expr; &lt;br /&gt;
    Parser p = new Parser(); &lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(&amp;quot;Enter an empty expression to stop.&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
    for(;;) { &lt;br /&gt;
      Console.Write(&amp;quot;Enter expression: &amp;quot;); &lt;br /&gt;
      expr = Console.ReadLine(); &lt;br /&gt;
      if(expr == &amp;quot;&amp;quot;) break; &lt;br /&gt;
      Console.WriteLine(&amp;quot;Result: &amp;quot; + p.Evaluate(expr)); &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==This module contains the recursive descent     parser that recognizes variables==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
/*  &lt;br /&gt;
   This module contains the recursive descent &lt;br /&gt;
   parser that recognizes variables. &lt;br /&gt;
*/ &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
// Exception class for parser errors. &lt;br /&gt;
class ParserException : ApplicationException { &lt;br /&gt;
  public ParserException(string str) : base(str) { }  &lt;br /&gt;
 &lt;br /&gt;
  public override string ToString() { &lt;br /&gt;
    return Message; &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
class Parser { &lt;br /&gt;
  // Enumerate token types. &lt;br /&gt;
  enum Types { NONE, DELIMITER, VARIABLE, NUMBER }; &lt;br /&gt;
  // Enumerate error types. &lt;br /&gt;
  enum Errors { SYNTAX, UNBALPARENS, NOEXP, DIVBYZERO }; &lt;br /&gt;
 &lt;br /&gt;
  string exp;    // refers to expression string &lt;br /&gt;
  int expIdx;    // current index into the expression &lt;br /&gt;
  string token;  // holds current token &lt;br /&gt;
  Types tokType; // holds token&amp;quot;s type &lt;br /&gt;
 &lt;br /&gt;
  // Array for variables. &lt;br /&gt;
  double[] vars = new double[26]; &lt;br /&gt;
 &lt;br /&gt;
  public Parser() { &lt;br /&gt;
    // Initialize the variables to zero. &lt;br /&gt;
    for(int i=0; i &amp;lt; vars.Length; i++)  &lt;br /&gt;
       vars[i] = 0.0; &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  // Parser entry point. &lt;br /&gt;
  public double Evaluate(string expstr) &lt;br /&gt;
  { &lt;br /&gt;
    double result; &lt;br /&gt;
   &lt;br /&gt;
    exp = expstr; &lt;br /&gt;
    expIdx = 0;  &lt;br /&gt;
 &lt;br /&gt;
    try {  &lt;br /&gt;
      GetToken(); &lt;br /&gt;
      if(token == &amp;quot;&amp;quot;) { &lt;br /&gt;
        SyntaxErr(Errors.NOEXP); // no expression present &lt;br /&gt;
        return 0.0; &lt;br /&gt;
      } &lt;br /&gt;
 &lt;br /&gt;
      EvalExp1(out result); // now, call EvalExp1() to start &lt;br /&gt;
 &lt;br /&gt;
      if(token != &amp;quot;&amp;quot;) // last token must be null &lt;br /&gt;
        SyntaxErr(Errors.SYNTAX); &lt;br /&gt;
 &lt;br /&gt;
      return result; &lt;br /&gt;
    } catch (ParserException exc) { &lt;br /&gt;
      // Add other error handling here, as desired. &lt;br /&gt;
      Console.WriteLine(exc); &lt;br /&gt;
      return 0.0; &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Process an assignment. &lt;br /&gt;
  void EvalExp1(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    int varIdx; &lt;br /&gt;
    Types ttokType; &lt;br /&gt;
    string temptoken; &lt;br /&gt;
 &lt;br /&gt;
    if(tokType == Types.VARIABLE) { &lt;br /&gt;
      // save old token &lt;br /&gt;
      temptoken = String.Copy(token); &lt;br /&gt;
      ttokType = tokType; &lt;br /&gt;
 &lt;br /&gt;
      // Compute the index of the variable. &lt;br /&gt;
      varIdx = Char.ToUpper(token[0]) - &amp;quot;A&amp;quot;; &lt;br /&gt;
 &lt;br /&gt;
      GetToken(); &lt;br /&gt;
      if(token != &amp;quot;=&amp;quot;) { &lt;br /&gt;
        PutBack(); // return current token &lt;br /&gt;
        // restore old token -- not an assignment &lt;br /&gt;
        token = String.Copy(temptoken); &lt;br /&gt;
        tokType = ttokType; &lt;br /&gt;
      } &lt;br /&gt;
      else { &lt;br /&gt;
        GetToken(); // get next part of exp &lt;br /&gt;
        EvalExp2(out result); &lt;br /&gt;
        vars[varIdx] = result; &lt;br /&gt;
        return; &lt;br /&gt;
      } &lt;br /&gt;
    } &lt;br /&gt;
 &lt;br /&gt;
    EvalExp2(out result); &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  // Add or subtract two terms. &lt;br /&gt;
  void EvalExp2(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    string op; &lt;br /&gt;
    double partialResult; &lt;br /&gt;
   &lt;br /&gt;
    EvalExp3(out result); &lt;br /&gt;
    while((op = token) == &amp;quot;+&amp;quot; || op == &amp;quot;-&amp;quot;) { &lt;br /&gt;
      GetToken(); &lt;br /&gt;
      EvalExp3(out partialResult); &lt;br /&gt;
      switch(op) { &lt;br /&gt;
        case &amp;quot;-&amp;quot;: &lt;br /&gt;
          result = result - partialResult; &lt;br /&gt;
          break; &lt;br /&gt;
        case &amp;quot;+&amp;quot;: &lt;br /&gt;
          result = result + partialResult; &lt;br /&gt;
          break; &lt;br /&gt;
      } &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Multiply or divide two factors. &lt;br /&gt;
  void EvalExp3(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    string op; &lt;br /&gt;
    double partialResult = 0.0; &lt;br /&gt;
   &lt;br /&gt;
    EvalExp4(out result); &lt;br /&gt;
    while((op = token) == &amp;quot;*&amp;quot; || &lt;br /&gt;
           op == &amp;quot;/&amp;quot; || op == &amp;quot;%&amp;quot;) { &lt;br /&gt;
      GetToken(); &lt;br /&gt;
      EvalExp4(out partialResult); &lt;br /&gt;
      switch(op) { &lt;br /&gt;
        case &amp;quot;*&amp;quot;: &lt;br /&gt;
          result = result * partialResult; &lt;br /&gt;
          break; &lt;br /&gt;
        case &amp;quot;/&amp;quot;: &lt;br /&gt;
          if(partialResult == 0.0) &lt;br /&gt;
            SyntaxErr(Errors.DIVBYZERO); &lt;br /&gt;
          result = result / partialResult; &lt;br /&gt;
          break; &lt;br /&gt;
        case &amp;quot;%&amp;quot;: &lt;br /&gt;
          if(partialResult == 0.0) &lt;br /&gt;
            SyntaxErr(Errors.DIVBYZERO); &lt;br /&gt;
          result = (int) result % (int) partialResult; &lt;br /&gt;
          break; &lt;br /&gt;
      } &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Process an exponent. &lt;br /&gt;
  void EvalExp4(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    double partialResult, ex; &lt;br /&gt;
    int t; &lt;br /&gt;
   &lt;br /&gt;
    EvalExp5(out result); &lt;br /&gt;
    if(token == &amp;quot;^&amp;quot;) { &lt;br /&gt;
      GetToken(); &lt;br /&gt;
      EvalExp4(out partialResult); &lt;br /&gt;
      ex = result; &lt;br /&gt;
      if(partialResult == 0.0) { &lt;br /&gt;
        result = 1.0; &lt;br /&gt;
        return; &lt;br /&gt;
      } &lt;br /&gt;
      for(t=(int)partialResult-1; t &amp;gt; 0; t--) &lt;br /&gt;
        result = result * (double)ex; &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Evaluate a unary + or -. &lt;br /&gt;
  void EvalExp5(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    string  op; &lt;br /&gt;
   &lt;br /&gt;
    op = &amp;quot;&amp;quot;; &lt;br /&gt;
    if((tokType == Types.DELIMITER) &amp;amp;&amp;amp; &lt;br /&gt;
        token == &amp;quot;+&amp;quot; || token == &amp;quot;-&amp;quot;) { &lt;br /&gt;
      op = token; &lt;br /&gt;
      GetToken(); &lt;br /&gt;
    } &lt;br /&gt;
    EvalExp6(out result); &lt;br /&gt;
    if(op == &amp;quot;-&amp;quot;) result = -result; &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Process a parenthesized expression. &lt;br /&gt;
  void EvalExp6(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    if((token == &amp;quot;(&amp;quot;)) { &lt;br /&gt;
      GetToken(); &lt;br /&gt;
      EvalExp2(out result); &lt;br /&gt;
      if(token != &amp;quot;)&amp;quot;) &lt;br /&gt;
        SyntaxErr(Errors.UNBALPARENS); &lt;br /&gt;
      GetToken(); &lt;br /&gt;
    } &lt;br /&gt;
    else Atom(out result); &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Get the value of a number or variable. &lt;br /&gt;
  void Atom(out double result) &lt;br /&gt;
  { &lt;br /&gt;
    switch(tokType) { &lt;br /&gt;
      case Types.NUMBER: &lt;br /&gt;
        try { &lt;br /&gt;
          result = Double.Parse(token); &lt;br /&gt;
        } catch (FormatException) { &lt;br /&gt;
          result = 0.0; &lt;br /&gt;
          SyntaxErr(Errors.SYNTAX); &lt;br /&gt;
        } &lt;br /&gt;
        GetToken(); &lt;br /&gt;
        return; &lt;br /&gt;
      case Types.VARIABLE: &lt;br /&gt;
        result = FindVar(token); &lt;br /&gt;
        GetToken(); &lt;br /&gt;
        return; &lt;br /&gt;
      default: &lt;br /&gt;
        result = 0.0; &lt;br /&gt;
        SyntaxErr(Errors.SYNTAX); &lt;br /&gt;
        break; &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
   // Return the value of a variable. &lt;br /&gt;
  double FindVar(string vname) &lt;br /&gt;
  { &lt;br /&gt;
    if(!Char.IsLetter(vname[0])){ &lt;br /&gt;
      SyntaxErr(Errors.SYNTAX); &lt;br /&gt;
      return 0.0; &lt;br /&gt;
    } &lt;br /&gt;
    return vars[Char.ToUpper(vname[0])-&amp;quot;A&amp;quot;]; &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  // Return a token to the input stream. &lt;br /&gt;
  void PutBack()   &lt;br /&gt;
  { &lt;br /&gt;
    for(int i=0; i &amp;lt; token.Length; i++) expIdx--; &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  // Handle a syntax error. &lt;br /&gt;
  void SyntaxErr(Errors error) &lt;br /&gt;
  { &lt;br /&gt;
    string[] err = { &lt;br /&gt;
      &amp;quot;Syntax Error&amp;quot;, &lt;br /&gt;
      &amp;quot;Unbalanced Parentheses&amp;quot;, &lt;br /&gt;
      &amp;quot;No Expression Present&amp;quot;, &lt;br /&gt;
      &amp;quot;Division by Zero&amp;quot; &lt;br /&gt;
    }; &lt;br /&gt;
 &lt;br /&gt;
    throw new ParserException(err[(int)error]); &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Obtain the next token. &lt;br /&gt;
  void GetToken() &lt;br /&gt;
  { &lt;br /&gt;
    tokType = Types.NONE; &lt;br /&gt;
    token = &amp;quot;&amp;quot;; &lt;br /&gt;
    &lt;br /&gt;
    if(expIdx == exp.Length) return; // at end of expression &lt;br /&gt;
   &lt;br /&gt;
    // skip over white space &lt;br /&gt;
    while(expIdx &amp;lt; exp.Length &amp;amp;&amp;amp; &lt;br /&gt;
          Char.IsWhiteSpace(exp[expIdx])) ++expIdx; &lt;br /&gt;
 &lt;br /&gt;
    // trailing whitespace ends expression &lt;br /&gt;
    if(expIdx == exp.Length) return; &lt;br /&gt;
 &lt;br /&gt;
    if(IsDelim(exp[expIdx])) { // is operator &lt;br /&gt;
      token += exp[expIdx]; &lt;br /&gt;
      expIdx++; &lt;br /&gt;
      tokType = Types.DELIMITER; &lt;br /&gt;
    } &lt;br /&gt;
    else if(Char.IsLetter(exp[expIdx])) { // is variable &lt;br /&gt;
      while(!IsDelim(exp[expIdx])) { &lt;br /&gt;
        token += exp[expIdx]; &lt;br /&gt;
        expIdx++; &lt;br /&gt;
        if(expIdx &amp;gt;= exp.Length) break; &lt;br /&gt;
      } &lt;br /&gt;
      tokType = Types.VARIABLE; &lt;br /&gt;
    } &lt;br /&gt;
    else if(Char.IsDigit(exp[expIdx])) { // is number &lt;br /&gt;
      while(!IsDelim(exp[expIdx])) { &lt;br /&gt;
        token += exp[expIdx]; &lt;br /&gt;
        expIdx++; &lt;br /&gt;
        if(expIdx &amp;gt;= exp.Length) break; &lt;br /&gt;
      } &lt;br /&gt;
      tokType = Types.NUMBER; &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
   &lt;br /&gt;
  // Return true if c is a delimiter. &lt;br /&gt;
  bool IsDelim(char c) &lt;br /&gt;
  { &lt;br /&gt;
    if((&amp;quot; +-/*%^=()&amp;quot;.IndexOf(c) != -1)) &lt;br /&gt;
      return true; &lt;br /&gt;
    return false; &lt;br /&gt;
  }   &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Demonstrate the parser. &lt;br /&gt;
 &lt;br /&gt;
public class ParserDemo1 { &lt;br /&gt;
  public static void Main() &lt;br /&gt;
  { &lt;br /&gt;
    string expr; &lt;br /&gt;
    Parser p = new Parser(); &lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(&amp;quot;Enter an empty expression to stop.&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
    for(;;) { &lt;br /&gt;
      Console.Write(&amp;quot;Enter expression: &amp;quot;); &lt;br /&gt;
      expr = Console.ReadLine(); &lt;br /&gt;
      if(expr == &amp;quot;&amp;quot;) break; &lt;br /&gt;
      Console.WriteLine(&amp;quot;Result: &amp;quot; + p.Evaluate(expr)); &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>