【问题标题】:unrecognized rule error in lex {lineo++;}lex {lineo++;} 中出现无法识别的规则错误
【发布时间】:2014-06-08 23:13:07
【问题描述】:

我的 lex 代码中有一些错误,也许有人知道我做错了什么......

16    %%
17    {ws}  {/*no action and no return */}
18    {}    
19    {newline} {lineo++;}
20    {number}  {tokenval=atoi(yytext); return(NUM);}
21    {id}      {
22          int p = 0;
23          p = lookup(yytext);
24          if (p == 0) 
25          p = insert (yytext, ID);
26      tokenval = p;
27      return symtable[p].token;
28    
29    }
30    
31    <<EOF>>   {return DONE;}
32      {tokenval = NONE; return yytext[0];}
33    
34    
35    %%

我是这种技术的新手,我花了很多时间但没有任何积极的结果。以下来自控制台的错误:

new.l:21: unrecognized rule
new.l:28: unrecognized rule
new.l:28: unrecognized rule
new.l:36: EOF encountered inside an action
new.l:36: unrecognized rule
new.l:36: fatal parse error
make: *** [lex.yy.c] Error 1

当我删除那些糟糕的代码行时(行:21-32)我得到了那个错误:

new.l:19:2: error: ‘lineo’ undeclared (第一次在这个函数中使用) {换行} {lineo++;}

【问题讨论】:

    标签: compiler-errors lex cc


    【解决方案1】:
    1. 第 18 行 ({}) 是错误的; flex 会将其视为一种模式,而不是一种动作。

    2. 您可能打算写lineno(即键入“Line Nº”的一种方式,它是“行号”的缩写。)但是您是否在某处声明了它?还是您打算使用yylineno

    3. 你定义了{id}吗?错误消息表明您没有粘贴,但您没有粘贴定义。

    4. 在第 32 行,默认规则的模式是 .

      . {tokenval = NONE; return yytext[0];}

    5. 你读过方便的flex manual吗?

    除上述之外,作为对第 3 点的替代,定义:

    id      {letter}({letter} | {digit})*
    

    不正确,因为正则表达式不能包含未加引号的空格。你需要把它写成

    id      {letter}({letter}|{digit})*
    

    【讨论】:

    • 这是我所有的代码:gist.github.com/Epredator/11263395。我正在尝试进行一些更改,但我仍然不知道它是如何工作的。我使用这本手册来 Flex:neo.dmcs.p.lodz.pl/tk/flex/flex.pdf 可能不是新版本但仍然有效;)
    • @Epredator:我又添加了一个错误来纠正。此外,您的最终代码块无效C,因为您定义的函数lexan 没有明确的返回类型;它可能应该写成int lexan() { return yylex(); },但它是多余的,因为你可以直接调用yylex。该手册确实适用于旧版本,我建议使用较新的版本,例如我链接到的那个。不过应该没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多