词法分析器的输出管理比输入管理简单得多,而且完全可选的。同样可以追溯到最早的lex版本,除非你另行设定,否则flex总会执行一条默认的规则:所有没有被匹配的输入都拷贝yyout然后输出。
%{
/* ...省略部分 */
#define ECHO fwrite(yytext, yyleng, 1, yyout)
%}
%%
/* ...省略部分 */
. ECHO; // flex默认的规则:所有没有被匹配的输入都拷贝yyout然后输出
%%
// 注意:由于目前还没有学到起始条件(start condition)相关的知识,以上flex默认的规则只是一个简版。
// 实际上它应该为:<*>.|\n ECHO;
注意:这对于那些仅处理一部分输入而保持剩余部分不变的flex程序来说可能有些作用,比如在英式英语转换到美式英语的翻译器中,但大多数情况下它更容易导致一些错误。flex允许你在词法分析器顶端设置%option nodefault
,使它不要添加默认的规则,这样当输入无法被给定的规则完全匹配时,词法分析器可以报告一个错误。
建议词法分析器总是使用nodefault选项,并在必要情况下包含自己的默认规则。