Bison多分析语句执行异常:仅首次执行成功问题排查
问题原因及修复方案
核心问题
- 语法规则未支持多语句循环:当前
command规则仅能匹配单条命令,解析器完成一次匹配后就进入终止状态,无法处理后续输入。 - 错误恢复机制缺失:
error规则没有重置解析器状态,单次语法错误后,解析器会一直处于错误模式,无法处理后续合法命令。 - 解析循环未实现:
main函数仅调用一次yyparse(),没有循环处理多次输入。
修复步骤
1. 修改Bison语法规则,支持多命令+错误恢复
替换原有的语法规则,添加循环结构和错误恢复指令:
%% commands: /* 空规则,匹配零条命令 */ | commands command ; command: SAVE DEPTH EQ NUMBER EXCLUDE EQ NUMBER { printf("Command parsed successfully.\n"); } | error { printf("Error: Invalid command.\n"); yyerrok; yyclearin; } ; %%
commands递归规则实现多条命令的连续解析;yyerrok重置解析器错误状态,允许后续正常解析;yyclearin清除当前未处理的输入符号,避免错误符号干扰后续命令。
2. 修改main函数,循环调用解析器
将原main函数改为循环执行yyparse(),直到输入结束:
int main() { int ret; while ((ret = yyparse()) != 0) { // 错误后强制重置解析器状态 yyerrok; yyclearin; } return 0; }
3. Flex代码无需修改
原Flex的词法分析逻辑正常,保持现有代码即可。
测试验证
重新编译后执行:
flex lexer.l bison -d parser.y gcc lex.yy.c parser.tab.c -o parser
此时可连续处理多条命令,结果如下:
save depth=1 exclude=1 Command parsed successfully. save Error: Invalid command. save depth=1 exclude=1 Command parsed successfully.
内容的提问来源于stack exchange,提问作者Four dimension
相关产品推荐
相关产品推荐

