【问题标题】:Getting: warning, rule cannot be matched获取:警告,规则无法匹配
【发布时间】:2013-02-10 00:45:43
【问题描述】:

我正在构建一个词法和语法分析器。当我尝试将 flex 与我的 .l 文件一起使用时,我收到以下警告。

littleDuck.l:26: warning, rule cannot be matched

第 26 条是以 {cteI} 开头的,我的规则部分如下:

[ \t\n]     ;
{RW}        {return RESERVED;}
{id}        {return ID;}
{ops}       {return OPERATOR;}
{seps}      {return SEPARATOR;}
{cteI}      {yylval.ival = atoi(yytext); return INT;}
{cteF}      {yylval.fval = atof(yytext); return FLOAT;}
{ctestring} {yylval.sval = strdup(yytext); return STRING;}
.       ;

另外,我的定义部分是这样的:

RW      program|var|int|float|print|else|if
id      ([a-z]|[A-Z)([a-z]|[A-Z]|[0-9])*
ops     "="|"<"|">"|"<>"|"+"|"-"|"/"|"*"
seps    ":"|","|";"|"{"|"}"|"("|")"
cteI    [0-9]+
cteF    {cteI}(\.{cteI}((e|E)("+"|"-")?{cteI})?)?
ctestring   (\".*\")

为什么会出现此警告,如何修改我的文件使其不会出现?

【问题讨论】:

    标签: bison yacc lex flex-lexer


    【解决方案1】:

    警告告诉你任何可能被{cteI} 匹配的东西总是会被一些较早的规则匹配。在您的情况下,它表示规则与您期望的不匹配,可能是由于拼写错误。在您的情况下,它是 {id} 规则,您将其定义为:

    ([a-z]|[A-Z)([a-z]|[A-Z]|[0-9])*
    

    注意括号和方括号的嵌套。为清楚起见添加空格,这是

    ( [a-z] | [A-Z)([a-z] | [A-Z] | [0-9] )*
    

    这将匹配任何字母、数字或字符序列 ( )[。您可能的意思是:

    ([a-z]|[A-Z])([a-z]|[A-Z]|[0-9])*
    

    可以更清楚地写成

    [a-zA-Z][a-zA-Z0-9]*
    

    【讨论】:

    • 非常感谢!我刚开始学习,我没有现在我可以使用 |那样。它肯定更清楚。另外,我没有注意到缺少方括号,我改变了很多东西,但没想到这是问题。
    【解决方案2】:

    查看规则的顺序,因为它很重要!

      1 [.] 
      2 "foo"
    

    这里永远不会匹配第二条规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多