【问题标题】:F(Lex) WARNING , rule cannot be matchedF(Lex) WARNING , 规则无法匹配
【发布时间】:2017-04-05 11:01:51
【问题描述】:
    EOL \n
    WS(" "|\t|\n)
    WSS {WS}*
    NEWSS {WSS}+
    NAME [a-zA-z_][a-zA-z0-9_-]*
    WORD [^;]+
    IMPORT {NEWSS}'{NAME}'{WSS};
    VAL [a-zA-z0-9]+
    CONTENT [^}]+
    MIX {NEWSS}{NAME}{WSS}[(]
    INCLUDE {WSS}{NAME}{WSS}[{]

    %s DOTAIM
    %s NAMESTATE
    %s NAMER
    %s CONTENT
    %s VALUE
    %s INC

    %%
    ${NAME} {key=yytext;BEGIN(NAMESTATE);}
    . {output+=yytext;}
    \n {output+=yytext;} 
  45)  <NAMESTATE>; {if(var.find(key)==var.end()){output="Unknown variable";return 1;};output+=(var[key]+yytext);BEGIN(INITIAL);}
    <NAMESTATE>{WSS}:{WSS} {BEGIN(DOTAIM);}
    <DOTAIM>{WORD}{WSS} {val=trim(yytext); var[key]=val;}
   48) <DOTAIM>; {BEGIN(INITIAL);}

这是我的代码,我不断收到此警告:

hello.lex:45:警告,无法匹配规则
hello.lex:48:警告,无法匹配规则

有人知道为什么吗?因为它们处于状态,并且第 43 行并没有阻止它们匹配。

【问题讨论】:

    标签: flex-lexer


    【解决方案1】:

    您将您的开始条件声明为包含 (%s):正如manual 所指出的,“如果开始条件是包含的,那么根本没有开始条件的规则也将处于活动状态。”

    因此,第 43 行的 . 将处于活动状态并阻止 ; 匹配。

    将后备规则移到规则末尾可以解决问题,即使您有开始条件,这通常也是最好的样式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多