我有一個YACC(Bison)語法,一個Lex(Flex)令牌生成器和一個C程序,其中我需要共享一個struct
(或者真正的任何變量)。目前,我在語法文件中聲明實際的對象,並且在我需要它的地方(也就是說,我的C源文件)聲明它,通常使用指針來處理它。我在C文件和語法文件之間有一個共享的頭文件(和實現)文件,其中有用於操縱我的數據結構的函數。這有效,但感覺有點不舒服。有沒有更好的方法來分享語法和程序之間的內存?在YACC,Lex和C文件之間共享內存
4
A
回答
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()來訪問。
相關問題
- 1. 在C#和原生C++之間共享內存
- 2. 在iPhone和PC之間共享文件
- 3. 在模塊之間共享內存
- 4. 使用lex和yacc
- 5. c文件之間共享變量
- 6. Java和C++共享內存
- 7. C-fork()和共享內存
- 8. 建議在lex和yacc
- 9. C++和Java進程之間的共享內存
- 10. 在PowerShell和C#之間共享變量
- 11. 在C++和QML之間共享(Q)WebChannel
- 12. Lex和Yacc和EBNF規範
- 13. 在C程序和shell腳本之間共享頭文件
- 14. C共享內存
- 15. 在32位和64位進程之間共享共享內存段
- 16. 使用內存中的SQLite數據庫在C++和C#之間共享數據?
- 17. 進程之間不共享共享內存
- 18. lex/yacc simple Q
- 19. 在JSP文件之間共享數據?
- 20. 在Javascript文件之間共享數據
- 21. 在QML文件之間共享對象
- 22. 在apks之間共享庫文件
- 23. 如何在服務和用戶進程之間共享內存?
- 24. 在C++項目之間共享中間文件?
- 25. 在Solaris中的父進程和子進程之間共享內存(在C中)
- 26. lua和C之間共享數組
- 27. 在PC之間共享Delphi中的公共內存區域
- 28. php和c之間的共享配置文件
- 29. Lex和Yacc沒有動態內存分配
- 30. CUDA:在不同內核之間使用共享內存