1

我的 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 (first use in this function) {newline} {lineo++;}

4

1 回答 1

3
  1. 第 18 行 ( {}) 是错误的;flex 会将其视为一种模式,而不是一种动作。

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

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

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

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

  5. 你读过方便的flex 手册吗?

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

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

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

id      {letter}({letter}|{digit})*
于 2014-04-23T22:56:07.517 回答