Flex lexer中无法识别的规则

PAV

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

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

错误:Cmd错误图片

有问题的行是:

{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"

伸缩模式可能不包含无引号的空格,无论是直接输入还是通过宏输入。

如果您坚持使用宏,则可能是:

boolean  True|False

尽管没有什么可以阻止您将模式直接插入规则中:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章