如何显式编写GNU Flex的默认规则?如何禁用该默认规则?
GNU Flex 默认规则的显式写法与禁用方法
刚好对GNU Flex的默认规则这块比较熟悉,给你详细说清楚:
一、默认规则的显式写法
你猜的没错!GNU Flex的默认行为,显式写出来就是下面这样:
%% . ECHO;
或者带上大括号的完整形式:
%% . { ECHO; }
这个规则的作用是匹配任意单个未被前面规则匹配到的字符,然后通过ECHO宏把字符输出到标准输出——这和Flex默认的“未匹配文本直接复制到输出”的行为完全一致。
二、如何禁用默认规则
要禁用默认的“输出未匹配文本”行为,核心思路是用自定义的兜底规则替代默认规则,具体有几种常见方式:
- 完全忽略未匹配字符:写一个什么都不做的兜底规则,这样未匹配的字符会被直接跳过,不会输出:
%% . ; /* 匹配任意未匹配字符,不执行任何动作 */ - 对未匹配字符做自定义处理:如果想对未匹配的字符进行报错、记录日志等操作,可以这样写:
%% . { fprintf(stderr, "错误:遇到未识别的字符 '%c'\n", yytext[0]); exit(EXIT_FAILURE); } - 全覆盖规则(间接禁用):如果你能确保自己写的规则覆盖了所有可能的输入字符,默认规则就不会被触发。但这种方式风险较高,万一有遗漏的字符,默认规则还是会生效,所以更推荐前面两种显式兜底的方式。
内容的提问来源于stack exchange,提问作者user1424739
相关产品推荐
相关产品推荐

