Compiler construction flex中匹配的一种奇怪情况
我正在用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。输出应为仅输入标识符。为什
%%
"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所说,这不是一个好主意,但是,您应该在解析器级别执行此操作