Flex 词法分析器中无法识别的规则

Unrecognized rule in Flex lexer

在制作 XML 解析器的过程中:

如标题所示,我已经记录了如下代码中所示的规则,但 flex 似乎错过了 一个特定的规则。

错误:Cmd Error Img

有问题的行是:

{boolean}        {yylval.booleanval  = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}```

当明确声明的 flex 似乎无视它时,对于其他规则则不会出现此类问题。

弹性代码:

    %option noyywrap
    %option yylineno

    string   [_a-zA-Z][_a-zA-Z0-9]*
    digit    [0-9]
    integer  {digit}+
    boolean  "True" | "False"
    text ({string}| )*

    %%
    .                          {printf("%s",yytext);}
    {boolean}                  {yylval.booleanval  = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}
    {integer}                  {return INT;}
    {string}                   {return STRING;}

    %%

重新阅读问题,我认为存在术语问题。 规则

{boolean}   {yylval.booleanval  = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}

与所有规则一样,该规则由 *pattern" 和一个动作组成。模式 {boolean} 仅包含一个宏扩展。宏扩展后,该行将不再被识别为规则因为宏定义中有杂散的空格,正如我在下面的原始答案中解释的那样:


如错误消息所示,问题出在您的 flex 文件第 22 行中的模式,其中包含 boolean:

的宏扩展
boolean  "True" | "False"

Flex 模式不得包含未加引号的空格,无论是直接输入还是通过宏输入。

如果你非要用宏,可以是:

boolean  True|False

虽然没有什么可以阻止您直接在规则中插入模式:

True|False   {yylval.booleanval  = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}