0

フレックスに問題があります。このルールのor演算子は認識されません。

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

それを3つのルールに分割すると、次のように認識されます。

[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

また、フレックスが他の文字に囲まれていない場合にのみ正しいパターンを認識するためには、これら3つのルールを追加する必要があります。

フルフレックスコード:

%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();
 }
4

1 に答える 1

0

lexパターンでは空白が重要です。 a | bと同じではありませんa|b。厄介なパターンでは、意図していない空白があります。

そうは言っても、私の意見では、3パターンソリューションの方が読みやすく、保守しやすいと思います。

于 2013-01-28T14:42:49.117 に答える