【问题标题】:Flex (lexical analyzer) not recognizing or operatorFlex(词法分析器)无法识别或操作
【发布时间】:2013-01-26 00:40:35
【问题描述】:

我对 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:%s\n",yytext); }

[0-9A-Za-z]+{CORRECT}  { printf("ERROR %d:Unidentified symbol: %s\n",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();
 }

【问题讨论】:

    标签: flex-lexer lexical-analysis


    【解决方案1】:

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

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

    【讨论】:

    • 正如你所说的空格是问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多