我試圖解析一個完全括號精通此語法:解析完全括號表達式
exp->(exp + exp)
|(exp - exp)
| num
num->[0-9]
...但我有一個問題:當我輸入「1 + 4」出現任何錯誤。我該如何解決它?
我試圖解析一個完全括號精通此語法:解析完全括號表達式
exp->(exp + exp)
|(exp - exp)
| num
num->[0-9]
...但我有一個問題:當我輸入「1 + 4」出現任何錯誤。我該如何解決它?
這是遞歸下降解析器的一個經典問題:您的語法不要求整個輸入被消耗。一旦它完成了「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();
}
}
嘗試使用此改變指令:如果(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();
}
}
謝謝,但如果我輸入>>(1+(6-5))它給我語法錯誤! – user1892248
是非常感謝:))) – user1892248
如果我修改匹配加入if(cin.peek()=='\ n') \t \t return; //會起作用嗎? – user1892248
@ user1892248請參閱編輯以瞭解如何修改「匹配」。 – dasblinkenlight