Compiler construction flex中匹配的一种奇怪情况

Compiler construction flex中匹配的一种奇怪情况,compiler-construction,flex-lexer,lexical-analysis,Compiler Construction,Flex Lexer,Lexical Analysis,我正在用flex编写扫描仪,我有以下两个定义: %% "int" printf("JUST_INT"); "int"[ \t\n]+"matrix" printf("MATRIX_INT"); [A-Za-z][A-Za-z0-9]* printf("IDENTIFIER"); %% 当扫描仪的输入为int matrixM=3时输出为MATRIX\u INT IDENTIFIER。它将输入视为int矩阵M=3。但实际上,这不是一个矩阵,标识符的名称是matrixM。输出应为仅输入标识符。为什

我正在用flex编写扫描仪,我有以下两个定义:

%%
"int" printf("JUST_INT");
"int"[ \t\n]+"matrix" printf("MATRIX_INT");
[A-Za-z][A-Za-z0-9]*  printf("IDENTIFIER");
%%

当扫描仪的输入为
int matrixM=3时输出为
MATRIX\u INT IDENTIFIER
。它将输入视为
int矩阵M=3
。但实际上,这不是一个
矩阵
,标识符的名称是
matrixM
。输出应为
仅输入标识符
。为什么会这样?这是因为我的定义吗

让规则扫描像
“int”[\t\n]+“matrix”
这样的空格不是一个好主意。只需将“int”、“matrix”和IDENTIFIER作为三个单独的标记返回,并让解析器对其进行排序。在这方面,它比flex要好得多
flex
只进行第一个最长匹配。

如果您真的想在扫描仪级别解决这个问题,您可以在

"int"[ \t\n]+"matrix"/($|[ \t\n]|;|whateverelsedelimitsanidentifier)
这确保只有在矩阵后面跟一个“非单词”时才匹配矩阵。正如EJP所说,这不是一个好主意,但是,您应该在解析器级别执行此操作