下面是flex诊断消息的列表:
1、’warning,rule cannot be matched’指示给定的规则不能被匹配,因为它遵循的其它规则总是与它匹配相同的文本。例如,在下面的例子中,’foo’不能被匹配,因为它出现在标识符’catch-all’规则之后:
[a-z]+ got_identifier();
foo got_foo();
在扫描器中使用REJECT将抑制此警告。
2、‘warning,-s option given but default rule can be matched’意味着有可能(或许只在特定的开始条件下)默认规则(匹配任何单个字符)是唯一匹配特定输入的规则。既然给出了’-s’,想必这不是有意的。
3、reject_used_but_not_detected undefined或yymore_used_but_not_detected undefined。这些错误可能在编译时发生。它们表明扫描器使用REJECT或yymore(),但是flex没有注意到这一事实,这意味着flex扫描了前两部分,寻找这些操作的发生,但是没有找到任何操作,但不知怎么的,你偷偷的将一些操作(例如,通过#include文件)带了进来。使用%option reject或%option yymore向flex表明你确实使用了这些特征。
4、‘flex scanner jammed’。使用’-s’编译的扫描器遇到了一个与它的任何规则都不匹配的输入字符串。此错误也可能由于内部问题而发生。
5、‘token too large,exceeds YYLMAX’。你的扫描器使用%array,其中一条规则匹配比YYLMAX常量(默认为8K字节)长的字符串。你可以通过在flex输入的定义部分中#define YYLMAX来增加该值。
6、‘scanner requires -8 flag to use the character ‘x’’。你的扫描器规范包括识别8位字符’x’,并且你没有指定-8标志,且你的扫描器默认为7位,因为你使用了’-Cf’或’-CF’表压缩选项。查看在扫描器选项章节中’-7’标志的详细讨论。
7、‘flex scanner push-back overflow’。你使用unput()弹出了许多的文本,以致于扫描器的缓冲区无法同时保存弹出的文本和在yytext中的当前标记。在这种情况下,扫描器应该动态调整缓冲区的大小,但目前还没有。
8、‘input buffer overflow,can’t enlarge buffer because scanner uses REJECT’。扫描器正在匹配一个非常大的标记,需要扩展输入缓冲区。这个不适用于REJECT的扫描器。
9、‘fatal flex scanner internal error --end of buffer missed’。这可能发生在长跳转(或越过)扫描器激活帧后重新进入的扫描器中。在重入扫描器之前,请使用:
yyrestart(yyin);
或者,如上所述,切换到使用C++扫描器类。
10、‘too many start conditions in <> construct!’你在<>结构中列出的启动条件比实际存在的要多(因此你必须至少两次列出其中一个)。
限制
某些尾随上下文模式无法正确匹配并生成警告信息(危险尾随上下文)。在这些模式中,规则第一部分的结尾与第二部分的开头匹配,例如’zx/xy’,其中’x*’与末尾上下文开头的’x’匹配。(请注意,POSIX草案声明由这种模式匹配的文本是未定义的。)对于一些尾随上下文规则,实际上是固定长度的部分不会被识别出来,从而导致上述性能损失。特别是,使用’|’或’{n}’的部分(例如’foo{3}’)总是被认为是可变长度的。将尾随上下文与特殊的’|’操作结合起来可能会导致固定尾随上下文被转换为代价更高的变量尾随上下文。例如:
%%
abc |
xyz/def
使用unput()将使yytext和yyleng无效,除非使用了%array指令或’-l’选项。NULs的模式匹配比匹配其它字符要慢的多。动态调整输入缓冲区的大小很慢,因为它需要重新扫描到目前为止与当前(通常很大)标记匹配的所有文本。由于输入缓冲和预读,你不能对<stdio.h>程序(如getchar())的调用与flex规则混合,并期望它能正常工作。改为调用input()。’-v’标志列出的表项总数不包括确定匹配了什么规则所需的表项数。如果扫描器不适用REJECT,则条目的数量等于DFA状态的数量,如果使用REJECT,则条目的数量略大于状态的数量。REJECT不能与’-f’或’-F’选项一起使用。
flex内部算法需要文档。
附加阅读
你可能希望阅读更多关于以下程序:
1、lex
2、yacc
3、sed
4、awk
下列书籍可能包含有趣的材料:
John Levine, Tony Mason, and Doug Brown, Lex & Yacc, O’Reilly and Associates. Be sure to get the 2nd edition.
M. E. Lesk and E. Schmidt, LEX – Lexical Analyzer Generator
Alfred Aho, Ravi Sethi and Jeffrey Ullman, Compilers: Principles, Techniques and Tools, Addison-Wesley (1986). Describes the pattern-matching techniques used by flex (deterministic finite automata).