C语言中的递归下降解析器-回溯时出错
使用示例输入“(a)”为给定语法实现递归下降解析器C语言中的递归下降解析器-回溯时出错,c,parsing,backtrace,recursive-descent,C,Parsing,Backtrace,Recursive Descent,使用示例输入“(a)”为给定语法实现递归下降解析器该程序的输出是检查用户读取的输入是否被成功解析。对于这个特定的输入,程序的流程应该如何进行 main()调用开始符号E()->T()->T1()[其计算结果为false]因此可以追溯到它的父函数T(),它现在调用T2()(其计算结果也为false),因此T()->T3()->E()->E1()->T()->T1()(计算结果为true) 最后E()也应该为真,语句return termal('(')&&E()&&termal(')中的最后一个条件
该程序的输出是检查用户读取的输入是否被成功解析。对于这个特定的输入,程序的流程应该如何进行
main()
调用开始符号E()->T()->T1()
[其计算结果为false]因此可以追溯到它的父函数T()
,它现在调用T2()
(其计算结果也为false),因此T()->T3()->E()->E1()->T()->T1()
(计算结果为true)
最后E()
也应该为真,语句return termal('(')&&E()&&termal(')中的最后一个条件termal('))
函数T3()
中的code>应使用')
作为标记的值来执行。然而,事实证明,token==”(“
仍然存在,因此程序的输出会导致
解析失败
不太清楚为什么标记
不等于)'
//语法:
//E->T | T+E
//T->a | a*T |(E)
//
//输入:
//(a)
#包括
char*next;
int E();
int E1();
int E2();
int T();
int T1();
int T2();
int T3();
国际术语(字符标记){
返回(*下一个+==令牌);
}
int E1(){
返回T();
}
int E2(){
返回T()&&termal('+')&&E();
}
int E(){
char*temp=next;
返回(next=temp,E1())|(next=temp,E2());
}
int T1(){
返回期限(“a”);
}
int T2(){
返回术语('a')&&termial('*')&&T();
}
int T3(){
返回术语(“(”)&&E()&&termial(“)”);
}
int T(){
char*temp=next;
返回(next=temp,T1())|(next=temp,T2()),(next=temp,T3());
}
int main(int argc,const char*argv[]{
char-str[10];
int结果;
printf(“输入要分析的字符串:”);
scanf(“%s”,str);
next=&str[0];
结果=E();
结果==1?printf(“解析成功”):printf(“解析不成功”);
printf(“\n”);
返回0;
}
在T()中
(next=temp,T3())
始终被调用(它前面的逗号处没有短路),并且在大多数情况下会返回false
,当T1()
或T2()
成功并且应该以成功结束函数时,会导致各种故障
将该行更改为:
return (next = temp, T1()) || (next = temp, T2()) || (next = temp, T3());
我建议通过一个调试器来运行它,显示next
,并查看您的期望在哪里被忽略。如果这还不能告诉您需要知道什么,请将结果发布回这里。在终端()中打印下一个后输出:(a)(a)(a)a)a)a)(a)(a)(a)a)a)a)解析失败
int T(){
char *temp = next;
return (next = temp, T1()) || (next = temp, T2()), (next = temp, T3());
}
return (next = temp, T1()) || (next = temp, T2()) || (next = temp, T3());