Flex中令牌匹配的优先顺序

时间:2011-07-18 17:11:42

标签: tokenize flex-lexer lexical-analysis

如果这个帖子的标题有点令人困惑,我很抱歉。我要问的是Flex(词法分析器)如何处理优先级问题?

例如,假设我有两个具有相似正则表达式的标记,按以下顺序编写:

"//"[!\/]{1}    return FIRST;
"//"[!\/]{1}\<  return SECOND;

如果输入“//!&lt;”,将返回FIRST或SECOND吗?或两者?

FIRST字符串将在SECOND字符串之前到达,但似乎返回SECOND将是正确的行为。

1 个答案:

答案 0 :(得分:10)

返回最长的匹配。

来自flex & bison, Text Processing Tools

  

Flex如何处理不明确的模式

     

大多数flex程序都很模糊,有多种模式可以匹配    相同的输入。 Flex通过两个简单的规则解决了歧义:

     
      
  • 每次扫描仪匹配输入时匹配最长的字符串。
  •   
  • 如果是平局,请使用程序中首先出现的模式。
  •   

您当然可以自己测试一下:

file:demo.l

%%
"//"[!/]   {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包含//!<