关于flex中匹配的奇怪情况

时间:2013-03-13 22:54:48

标签: 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_INT IDENTIFIER。它将输入视为int matrix M=3。但实际上,这不是matrix,标识符的名称是matrixM。输出应为JUST_INT IDENTIFIER。为什么会这样?那是因为我的定义吗?

2 个答案:

答案 0 :(得分:2)

拥有扫描"int"[ \t\n]+"matrix"等空格的规则并不是一个好主意。只需将“int”,“matrix”和IDENTIFIER作为三个单独的标记返回,然后让解析器对其进行排序。它比flex要好得多。 flex只进行第一次最长的比赛。

答案 1 :(得分:1)

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

"int"[ \t\n]+"matrix"/($|[ \t\n]|;|whateverelsedelimitsanidentifier)

这确保只有matrix后面跟着“非单词”才匹配。正如EJP所说,这不是一个好主意,你应该在解析器级别这样做。