-2

我正在用 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. 为什么会这样?是因为我的定义吗?

4

2 回答 2

2

拥有跨空间扫描的规则(如"int"[ \t\n]+"matrix". 只需将“int”、“matrix”和 IDENTIFIER 作为三个单独的标记返回,然后让解析器对其进行排序。这比现在好多了flexflex只做第一个最长的匹配。

于 2013-03-14T01:19:52.403 回答
1

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

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

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

于 2013-03-14T10:35:03.870 回答