2014-04-23 160 views
1

我有我的代码法的一些错误,也许有人知道我做了什么错?无法识别的规则错误{LINEO ++;}

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 

当我删除了代码whoes坏(线路:21-32)线我有一个错误:

new.l:19:2: error: ‘lineo’ undeclared (first use in this function) {newline} {lineo++;}

回答

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

  2. 你可能打算写lineno(也就是说,一种输入“行号”的方式是“行号”的缩写)。但是你有没有把它声明在某处?或者你打算使用yylineno

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

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

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

  5. 你读过得心应手flex manual

除了上述之外,作为替代点3,定义:因为正则表达式不能包括无引号空白

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

不正确。你需要写,作为

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

这是我的所有代码:https://gist.github.com/Epredator/11263395 。我试图做一些改变,但我仍然不知道它是如何工作的。我使用这个手册来Flex:http://neo.dmcs.p.lodz.pl/tk/flex/flex.pdf也许不是新的版本,但仍然有效;) – Epredator

+0

@Epredator:我添加了一个更正的错误。另外,你的最终代码块不是'C',因为你定义的函数'lexan'没有显式的返回类型;它可能应该写成'int lexan(){return yylex(); }'但它是多余的,因为你可以直接调用'yylex'。该手册确实是一个较旧的版本,我建议使用一个更新的版本,例如我链接的那个。但它应该没问题。 – rici