Yacc解析器无法正确识别自定义语言,存在语法错误与行号问题
Yacc语法错误与行号问题排查建议
一、行号显示不正确的排查方向
- 检查
mylex.l中是否正确维护行号计数器:- 确保匹配换行符
\n时执行行号递增操作,示例代码:\n { yylineno++; } - 在
myyacc.y开头添加声明,确保Yacc能正确获取行号变量:extern int yylineno;
- 确保匹配换行符
- 若自定义了输入处理逻辑,检查是否遗漏换行符的行号更新步骤。
二、"Line 3: syntax error near 12"错误排查
- 先确认测试用例第3行内容,检查
12所在位置的语法是否符合自定义规则,比如是否存在非法符号、关键字误用,或语法规则未覆盖数字的合法场景。 - 验证
mylex.l的数字匹配规则:- 确保数字被正确识别为对应token(如
INT),避免被其他规则优先匹配,示例代码:[0-9]+ { yylval.int_val = atoi(yytext); return INT; }
- 确保数字被正确识别为对应token(如
- 检查
myyacc.y的语法规则:- 确认规则中包含数字的合法使用场景,比如允许数字作为表达式节点的规则
expr : INT,否则解析到数字时会触发语法错误。
- 确认规则中包含数字的合法使用场景,比如允许数字作为表达式节点的规则
- 开启Yacc调试模式辅助定位:
- 编译时添加
-DYYDEBUG=1,在代码中设置yydebug = 1;,查看解析过程的token流和状态转换,定位错误触发的具体步骤。
- 编译时添加
三、通用排查步骤
- 单独测试词法分析器:编译
lex mylex.l生成的代码,输入测试用例,查看输出的token序列是否符合预期,排除词法部分问题。 - 简化测试用例:编写最小规模的错误触发用例,逐步添加内容,定位具体语法问题点。
内容的提问来源于stack exchange,提问作者mariko
相关产品推荐
相关产品推荐

