Flex中令牌匹配的优先顺序

Cas*_*ton 6 lexical-analysis tokenize flex-lexer

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

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

"//"[!\/]{1}    return FIRST;
"//"[!\/]{1}\<  return SECOND;
Run Code Online (Sandbox Code Playgroud)

如果输入"//!<",将返回FIRST或SECOND吗?或两者?

第一个字符串将在SECOND字符串之前到达,但似乎返回SECOND将是正确的行为.

Bar*_*ers 11

返回最长的匹配.

来自flex&bison,文本处理工具:

Flex如何处理模糊模式

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

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

你可以自己测试一下,当然:

file:demo.l

%%
"//"[!/]   {printf("FIRST");}
"//"[!/]<  {printf("SECOND");}
%%

int main(int argc, char **argv)
{
    while(yylex() != 0);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,/并且<不需要转义,并且{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
Run Code Online (Sandbox Code Playgroud)

哪里in.txt包含//!<.