我正在写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
。为什么会这样?那是因为我的定义吗?
答案 0 :(得分:2)
拥有扫描"int"[ \t\n]+"matrix"
等空格的规则并不是一个好主意。只需将“int”,“matrix”和IDENTIFIER作为三个单独的标记返回,然后让解析器对其进行排序。它比flex
要好得多。 flex
只进行第一次最长的比赛。
答案 1 :(得分:1)
如果你真的想在扫描仪级别解决这个问题,你可以匹配
"int"[ \t\n]+"matrix"/($|[ \t\n]|;|whateverelsedelimitsanidentifier)
这确保只有matrix
后面跟着“非单词”才匹配。正如EJP所说,这不是一个好主意,你应该在解析器级别这样做。