为何Lex/Flex会输出未匹配输入?如何阻止该现象?
解决Flex中未匹配输入自动输出的问题
哦,这个坑我当初刚学Flex的时候也踩过!其实原因很简单:Flex有个默认行为——任何没被你写的规则匹配到的字符,都会自动执行ECHO动作(也就是原样输出),这就是输入affafe会被直接打出来的原因。
要阻止这种情况,你只需要在规则的最后添加一个“兜底”规则,捕获所有未被前面规则匹配的内容,然后让它什么都不做就行。修改后的代码如下:
%% [0-9]+ { printf("%s is a number\n", yytext); } . { /* 忽略所有未匹配的单个字符 */ } %% int main() { yylex(); }
补充说明:
- 这里的
.会匹配除换行符外的任意单个字符,如果你的输入里有换行符也需要忽略,可以把规则改成[\n.]或者[^](后者匹配所有字符,包括换行)。 - 一定要把这个兜底规则放在所有规则的最后!因为Flex是按照规则的顺序,优先匹配最长、最靠前的规则,放在最后才能保证它只捕获前面规则没覆盖到的内容。
- 如果你想对未匹配字符做其他处理(比如报错),也可以在这个规则的动作里写逻辑,比如:
. { fprintf(stderr, "Unrecognized character: %c\n", *yytext); }
内容的提问来源于stack exchange,提问作者user9175806
相关产品推荐
相关产品推荐

