Flex在CHR状态下扫描EOF出现重复报错该如何解决?
重复报错的根本原因
这是Flex/Lex扫描器的起始状态(Start Condition)持久化特性导致的:
- 你在匹配到字符字面量的开头单引号
'时,已经调用BEGIN(CHR)将扫描器切换到了专门处理字符内容的CHR自定义状态,该状态会一直保留直到你手动切换到其他状态。 - 最初的代码在CHR状态下触发EOF规则时,只打印了错误、返回了整数字面量token,没有将扫描器状态切回默认的INITIAL状态。
- 当你把INTLIT返回给语法解析器后,解析器会继续要求扫描器提供下一个token,此时扫描器仍然停留在CHR状态,输入已经处于EOF位置,就会第二次匹配到
<CHR><<EOF>>规则,重复打印错误。
修复逻辑说明
你添加的BEGIN(INITIAL)就是在返回INTLIT之前手动将扫描器切回默认初始状态,下次解析器请求下一个token时,扫描器会触发INITIAL状态下的EOF处理逻辑,直接返回EOF标记终止扫描,不会再进入CHR状态的EOF规则,自然不会重复打印错误。
内容的提问来源于stack exchange,提问作者Riomare
相关产品推荐
相关产品推荐

