2010-03-14 77 views
4

我有一個YACC(Bison)語法,一個Lex(Flex)令牌生成器和一個C程序,其中我需要共享一個struct(或者真正的任何變量)。目前,我在語法文件中聲明實際的對象,並且在我需要它的地方(也就是說,我的C源文件)聲明它,通常使用指針來處理它。我在C文件和語法文件之間有一個共享的頭文件(和實現)文件,其中有用於操縱我的數據結構的函數。這有效,但感覺有點不舒服。有沒有更好的方法來分享語法和程序之間的內存?在YACC,Lex和C文件之間共享內存

回答

4

在需要它的源文件之間共享extern聲明的頭文件通常是最佳途徑。主要的選擇是爲其提供「功能訪問」 - 即某種「獲取價值」和「設定值」功能(或一組功能)。這通常是矯枉過正的。確保在語法(您​​定義變量的位置)以及詞法分析器和其他代碼中包含標題,以便儘可能快地發現不一致。

2

如果你想堅持標準(POSIX)lex/yacc,那麼你唯一的選擇就是去尋找全局變量/函數。如果您使用Bison和Flex擴展的方式很好,可以通過幾種方法來傳遞變量,主要是向yyparse()和yylex()添加額外的參數。

在野牛中,這是通過%lex-param和%parse-param完成的。

%parse-param { struct somestruct *mystruct } 
%lex-param { struct somestruct *mystruct } 

在Flex中,有兩種不同的機制,具體取決於是否需要重入詞法分析器。假設你去使用默認(非重入)選項,你要重新定義YY_DECL:

%{ 
#define YY_DECL int yylex(struct somestruct *mystruct) 
%} 

在折返的Flex詞法分析器,額外的參數可以通過Flex的隨身攜帶,以保持掃描儀結構中加入其州。你需要定義YY_EXTRA_TYPE;額外的數據可以通過yyget/set_extra()來訪問。