2012-01-04 72 views
1

下面是一個簡單的算術表達式解析器我寫的代碼:如果需要信息關於整個Parser我在做這個算術解析器有什麼問題?

class ArithmeticExpressionParser<T> : Parser<T> where T : IConvertible 
{ 
    dynamic num1, num2; 
    public override T Parse(string expr) 
    { 
     base.Parse(expr); 
     ParseExpression(); 
     return num1; 
    } 

    T ParseExpression() 
    { 
     if(PeekNextToken()) 
      num1 = ParseFactorial(); 

     if (Token == '+') 
     { 
      GetNextToken(); 
      num2 = ParseExpression(); 
      num1 += num2; 
     } 

     else if (Token == '-') 
     { 
      GetNextToken(); 
      num2 = ParseExpression(); 

      num1 -= num2; 
     } 

     return num1; 
    } 

    T ParseFactorial() 
    { 
     if(PeekNextToken()) 
      num1 = ParseNumber(); 

     if (Token == '*') 
     { 
      GetNextToken(); 
      num2 = ParseFactorial(); 

      num1 *= num2; 
     } 

     else if (Token == '/') 
     { 
      GetNextToken(); 
      num2 = ParseFactorial(); 

      num1 /= num2; 
     } 

     else if (Token == '%') 
     { 
      GetNextToken(); 
      num2 = ParseFactorial(); 

      num1 %= num2; 
     } 

     return num1; 
    } 


    T ParseNumber() 
    { 
     string temp = String.Empty; 

     while (char.IsDigit(Token)) 
     { 
      temp += Token; 
      GetNextToken(); 
     } 

     return (T)Convert.ChangeType(temp, typeof(T));   
    } 
} 

,只是評論,我會張貼。 現在,這裏是我想的東西是相關的:

protected char GetNextToken() 
    { 
     do 
     { 
      if(Count++ >= expression.Length-1) break; 

     } while (char.IsWhiteSpace(expression[Count])); 

     return expression[Count]; 
    } 

    protected bool PeekNextToken() 
    { 
     if (Count + 1 < expression.Length) 
      return true; 
     else 
      return false; 
    } 

    string expression; 

    protected char Token 
    { 
     get 
     { 
      return expression[Count]; 
     } 
    } 

    int count; 
    protected int Count 
    { 
     get { return count; } 
     set 
     { 
      if (value < expression.Length) 
       count = value; 
     } 
    } 

現在的問題是,它並沒有給出正確的結果。

  • 2 + 2 * 2返回
  • 2 + 2 + 2 + 2返回
  • 2 + 2-2返回

...很多奇怪的結果。

此外,請提出改進​​建議,以及更好的方法來達到同樣的效果。

注:我想寫一個簡單的算術Recursive Descent Parser

回答

2

我沒有解決方案,但看代碼 - 「ParseExpression」和「ParseFactorial」操作,並返回NUM1,其成員由所有accesed 。以你的最後一個例子2 + 2-2爲例,發生的第一個操作是2-2 = 0,並且這將覆蓋第一讀取值爲等於2的num1。因此,在可以完成之前,num1 = 0添加操作,因此你得到0.

我檢查了這個邏輯給出了3個例子提供的結果輸出。

我確實發現了一個錯誤,如果沒有空格或分隔符,您的代碼將不會讀取最後一個字符。

相關問題