2014-04-23 179 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