この文法の完全に括弧で囲まれた Exp を解析しようとしています:
exp->(exp + exp)
|(exp - exp)
| num
num->[0-9]
...しかし、問題があります。「1+4」と入力してもエラーは表示されません。どうすれば解決できますか??
この文法の完全に括弧で囲まれた Exp を解析しようとしています:
exp->(exp + exp)
|(exp - exp)
| num
num->[0-9]
...しかし、問題があります。「1+4」と入力してもエラーは表示されません。どうすれば解決できますか??
これは再帰下降パーサーの典型的な問題です。文法では、入力全体が消費される必要はありません。「whileisdigit」ループで終了すると+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();
}
}
この変更された命令を試してください: if (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();
}
}