Bison运行时为何总是输出大于号?如何配置可省略该多余符号?
问题原因
末尾多出的>不是Bison默认输出的内容,问题出在词法分析环节或者语法动作逻辑:
- Bison本身仅负责语法解析,没有内置的输出逻辑,所有输出内容都来自你编写的词法动作、语法动作或者错误处理逻辑
- 90%以上的这类问题都是Flex(和Bison配套的词法分析器)的兜底规则导致的:如果你的Flex规则中写了默认的
. ECHO;兜底匹配逻辑,当输入文件末尾存在未被你自定义规则匹配的字符(比如多余的特殊符号、不可见控制符、未闭合的标记)时,Flex会直接把未匹配的字符输出到标准输出,你看到的>就是输入末尾未匹配的字符被直接输出的结果 - 少数情况是Bison的
yyerror错误处理函数、或者XML生成的语法动作中存在逻辑漏洞,解析结束时多输出了未预期的符号
解决方法
1. 优先修改Flex词法规则
删除Flex规则段的默认ECHO兜底规则,替换为显式的忽略/报错逻辑:
/* 删除原有类似这样的兜底规则 */ /* . ECHO; */ /* 替换为忽略未匹配字符,或者你需要的报错逻辑 */ . { /* 无任何动作,直接丢弃未匹配字符 */ }
如果需要定位问题来源,可以临时在兜底规则中加调试日志:
. { fprintf(stderr, "未匹配字符:ASCII码%d,内容[%c]\n", *yytext, *yytext); }
2. 关闭Flex默认兜底逻辑
可以在Flex定义段添加配置%option nodefault,该配置会禁止Flex自动生成默认的ECHO兜底规则,编译阶段如果存在未覆盖的字符匹配场景会直接抛出警告,从根源避免漏写规则导致的多余输出。
3. 检查错误处理逻辑
确认yyerror函数、语法错误恢复的动作代码中没有输出>的相关逻辑,很多网上的示例代码的错误处理逻辑会带多余的输出代码,直接复用未修改的话容易出现这类问题。
4. 校验输入文件
确认待解析的输入文件末尾没有多余的未闭合>符号,避免被词法规则直接匹配输出。
内容的提问来源于stack exchange,提问作者Roger Costello
相关产品推荐
相关产品推荐

