如果这个帖子的标题有点令人困惑,我很抱歉。我要问的是Flex(词法分析器)如何处理优先级问题?
例如,假设我有两个具有相似正则表达式的标记,按以下顺序编写:
"//"[!\/]{1} return FIRST;
"//"[!\/]{1}\< return SECOND;
如果输入“//!&lt;”,将返回FIRST或SECOND吗?或两者?
FIRST字符串将在SECOND字符串之前到达,但似乎返回SECOND将是正确的行为。
答案 0 :(得分:10)
返回最长的匹配。
来自flex & bison, Text Processing Tools:
Flex如何处理不明确的模式
大多数flex程序都很模糊,有多种模式可以匹配 相同的输入。 Flex通过两个简单的规则解决了歧义:
- 每次扫描仪匹配输入时匹配最长的字符串。
- 如果是平局,请使用程序中首先出现的模式。
您当然可以自己测试一下:
%%
"//"[!/] {printf("FIRST");}
"//"[!/]< {printf("SECOND");}
%%
int main(int argc, char **argv)
{
while(yylex() != 0);
return 0;
}
请注意,/
和<
不需要转义,{1}
是多余的。
bart@hades:~/Programming/GNU-Flex-Bison/demo$ flex demo.l
bart@hades:~/Programming/GNU-Flex-Bison/demo$ cc lex.yy.c -lfl
bart@hades:~/Programming/GNU-Flex-Bison/demo$ ./a.out < in.txt
SECOND
其中in.txt
包含//!<
。