Flex(词法分析器)无法识别或运算符



我对flex有问题。它无法识别此规则中的 or 运算符:

[0-9A-Za-z]+{CORRECT} | {CORRECT}[0-9A-Za-z]+ [0-9A-Za-z]+{CORRECT}[0-9A-Za-z]+ {...}

如果我将其拆分为三个规则,则可以识别它:

[0-9A-Za-z]+{CORRECT}  {...}
{CORRECT}[0-9A-Za-z]+ { ...}
[0-9A-Za-z]+{CORRECT}[0-9A-Za-z]+ {...}

为了更好地解释自己,我试图识别的模式是:

CORRECT [1-9]*_[1-9]*0

为了使flex仅在没有其他字符包围时才识别正确的模式,我必须添加这三个规则。

完整的弹性代码:

%option noyywrap
%{
#include <stdio.h>
int num_lines=1;
%}
CORRECT [1-9]*_[1-9]*0
%%
{CORRECT} { printf("CORRECT TOKEN:%sn",yytext); }
[0-9A-Za-z]+{CORRECT}  { printf("ERROR %d:Unidentified symbol: %sn",num_lines,yytext);}
{CORRECT}[0-9A-Za-z]+ { printf("ERROR %d:Unidentified symbol: %s n",num_lines,yytext);}
[0-9A-Za-z]+{CORRECT}[0-9A-Za-z]+ { printf("ERROR %d:Unidentified symbol: %s  n",num_lines,yytext); }
"n" { num_lines++; }
 " "
 "t"
 "r"
 . { printf("ERROR %d:Unidentified symbol: %s n",num_lines,yytext);}
 %%
 int main(int argc,char **argv)
 {
++argv,--argc;
if(argc>0) 
    yyin=fopen(argv[0],"r");
else
    yyin=stdin;
yylex();
 }
空格在

lex 模式中很重要。 a | ba|b不同。 在麻烦的模式中,你有空格,我认为你不想要。

也就是说,在我看来,您的 3 模式解决方案更易于阅读和维护。

最新更新