【问题标题】:Unrecognized rule in Flex lexerFlex 词法分析器中无法识别的规则
【发布时间】:2018-09-15 17:23:35
【问题描述】:

在制作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;}

    %%

【问题讨论】:

    标签: parsing bison flex-lexer


    【解决方案1】:

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

    {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;}
    

    【讨论】:

    • 这似乎解决了谢谢,但出现了其他问题。我收到一条警告,第 55-58 行的规则无法匹配。这是因为以前的布尔声明吗?或者是额外的东西?
    • @P.Evripidis:没有。这是因为其中任何一个都已经与 [_a-zA-Z][_a-zA-Z0-9]* 匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2021-11-25
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多