2012-09-22 108 views
1

如何打印發生錯誤的行號。我試圖在yyerror()功能使用yylineno,寫在.l文件%option yylineno但在編譯之後它給了我一個錯誤「yylineno undeclared (first use in this function)」如果我初始化yylineno爲1它給了我這個錯誤:初學者bison flex

error: redefinition of yylineno 
lex.yy.c:273: note: previous definition of yylineno was here 
+1

如果您提供了更多的細節,這將有所幫助。 yyerror是由野牛骨架援引的; yylineno由flex提供(通常它是一個宏)。您可能沒有安排yylineno定義在yyerror是其中一部分的編譯單元中可見(如果您使用的是C++,則特別容易,但使用普通的C排列也很容易)。還有哪些其他的flex選項使用? (例如,你是否要求重入?) – rici

回答

2

還有第二個請求flex提供全局變量yylineno的方法:命令行開關-l。如果這不適合你,你可以管理自己的全球化,就像Levine et al。提示。在任何匹配換行符的規則中增加它。

%{ 
    int mylineno = 1; 
%} 
%% 
* * * 
\n { mylineno++; } 
1

有幾種方法可能會遇到問題,但哪一個是相關的很難猜測。

  1. 你必須在Flex源(.l文件,並從源頭上創建的目標文件)中定義的變量,但你不要在野牛語法(.y文件)或頭部聲明它,所以它在編譯語法時未聲明。

  2. 你確實已經在語法中聲明瞭它,但是你仍然遇到問題。從文法或詞法分析器生成的.c文件中的片段順序可能不是您所期望的,因此您最終在聲明變量之前引用該變量。引用它的代碼可能出現在%{ ... %}塊中,它可能出現在第二個%%節標記之後,它可能出現在語法(或詞法分析器)操作塊之一中,或者可能出現在源中的某個其他位置。如果每個引用yylineno變量的變量在塊中都有一個純聲明(最好通過一個頭文件),那麼代碼應該是OK的。你試圖消除重複,但是冒着重複自己的風險(如果你的頭文件是冪等的,這不應該是一個大問題),你可以確保它在所有適當的部分被聲明。

請注意,默認情況下,語法不包含來自詞法分析器的信息;你必須確保共享信息得到適當的聲明和定義。

+0

如果我在.l文件中初始化yyerror,我如何在.y文件中共享它。 – user1690394