Compiler errors lex{lineo+;+;}中无法识别的规则错误

Compiler errors lex{lineo+;+;}中无法识别的规则错误,compiler-errors,lex,cc,Compiler Errors,Lex,Cc,我的莱克斯密码有一些错误,也许有人知道我做错了什么 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

我的莱克斯密码有一些错误,也许有人知道我做错了什么

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    %%
当我删除了那些不好的代码行(第21-32行)时,我得到了以下错误:

new.l:19:2:错误:“lineo”未声明(首次在此函数中使用) {newline}{lineo++;}

  • 第18行(
    {}
    )完全错了;flex会将其视为一种模式,而不是一种行为

  • 你可能想写
    lineno
    (也就是说,输入“Line N:”的一种方式,它是“Line number”的缩写),但是你在什么地方声明了吗?或者您是否打算使用
    yylineno

  • 您是否定义了
    {id}
    ?错误消息表明您没有粘贴定义,但您没有粘贴定义

  • 在第32行中,默认规则的模式是

    。{tokenval=NONE;返回yytext[0];}

  • 你看过手边的报纸了吗

  • 除上述内容外,作为第3点的替代,定义如下:

    id      {letter}({letter} | {digit})*
    
    不正确,因为正则表达式不能包含无引号的空格。你需要把它写成

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

    这是我的全部代码:。我试图做一些改变,但我仍然不知道它是如何工作的。我使用本手册来调整:可能不是新版本,但仍然有效;)@Epredator:我又添加了一个错误来纠正。另外,由于您定义的函数
    lexan
    没有显式返回类型,因此您的最终代码块无效
    C
    ;它可能应该被编写成
    int-lexan(){return yylex();}
    ,但是它是多余的,因为您可以直接调用
    yylex
    。这本手册确实是针对旧版本的,我建议使用更新的版本,比如我链接的版本。但应该没问题。
    id      {letter}({letter}|{digit})*