2012-12-15 49 views
3

我試圖解析一個完全括號精通此語法:解析完全括號表達式

exp->(exp + exp) 
    |(exp - exp) 
    | num 
num->[0-9] 

...但我有一個問題:當我輸入「1 + 4」出現任何錯誤。我該如何解決它?

回答

2

這是遞歸下降解析器的一個經典問題:您的語法不要求整個輸入被消耗。一旦它完成了「while isdigit」循環,它就認爲它完成了工作,忽略了輸入的+4部分。

添加檢查該行的結束時達到頂級的表達,來電後解決這個問題:

void TopExp() { 
    Expr(); 
    Match('\n'); 
} 

您需要修改Match允許匹配\n在沒有額外的輸入可用:

void Match(char c) { 
    int p = cin.peek(); 
    if(p==c) { 
     cin>>c; 
    } else if (p == EOF && c == '\n') { 
     return 
    } else { 
     cout<<"Syntax Error! "<<(char)cin.peek()<<endl; 
     cin.ignore(); 
    } 
} 
+0

是非常感謝:))) – user1892248

+0

如果我修改匹配加入if(cin.peek()=='\ n') \t \t return; //會起作用嗎? – user1892248

+0

@ user1892248請參閱編輯以瞭解如何修改「匹配」。 – dasblinkenlight

2

嘗試使用此改變指令:如果(openParenthesis-closeParenthesis> 0)

int Match(char c) 
    { 
     if(cin.peek()==c) { 
      cin>>c; 
      return 1; 
     } else 
     { 
      cout<<"Syntax Error! "<<(char)cin.peek()<<endl; 
      cin.ignore(); 
      return 0; 
     } 
    } 

    void MatchOp() 
    { 
     if(cin.peek()=='+') 
      Match('+'); 
     else if(cin.peek()=='-') 
      Match('-'); 
     else 
     { 
      cout<<"invalid Operation: "<<(char)cin.peek()<<endl; 
      cin.ignore(); 
     } 
    } 

    void Exp() 
    { static int openParenthesis = 0; 
     static int closeParenthesis = 0; 
     if(cin.peek()!='\n') 
      if(cin.peek()=='(') 
      { 
       if (Match('(') == 1) { 
        openParenthesis += 1; 
       } 
       Exp();MatchOp();Exp(); 
       if (Match(')') == 1) { 
        closeParenthesis -= 1; 
       } 
      } 
      else if(isdigit(cin.peek())) 
      { 
       if (openParenthesis-closeParenthesis>0) { 
        cout<<"Syntax Error! "<<(char)cin.peek()<<endl; 
        cin.ignore();    
       } else { 
        while(isdigit(cin.peek())) 
        { cout<<(char)cin.peek(); 
        Match(cin.peek()); 
        } 
       } 
      } 
      else 
      { 
       cout<<"Syntax Error!"<<(char)cin.peek()<<endl; 
       cin.ignore(); 
      } 
    } 
+0

謝謝,但如果我輸入>>(1+(6-5))它給我語法錯誤! – user1892248