You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bison多分析语句执行异常:仅首次执行成功问题排查

问题原因及修复方案

核心问题

  1. 语法规则未支持多语句循环:当前command规则仅能匹配单条命令,解析器完成一次匹配后就进入终止状态,无法处理后续输入。
  2. 错误恢复机制缺失:error规则没有重置解析器状态,单次语法错误后,解析器会一直处于错误模式,无法处理后续合法命令。
  3. 解析循环未实现: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:23:18