我有一個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. C++和c之間的共享內存同步#
- 3. 在iPhone和PC之間共享文件
- 4. 在C#和C++之間共享變量
- 5. 在C#和C之間共享變量
- 6. 在模塊之間共享內存
- 7. 使用lex和yacc
- 8. c文件之間共享變量
- 9. Java和C++共享內存
- 10. C-fork()和共享內存
- 11. 控制如何apc.shm_size在字節碼緩存和共享內存之間共享
- 12. 建議在lex和yacc
- 13. C++和Java進程之間的共享內存
- 14. 用戶空間和內核線程之間的共享內存
- 15. 在PowerShell和C#之間共享變量
- 16. 在Matlab和C之間共享數據
- 17. 在Python和C++之間共享數據
- 18. 在C++和QML之間共享(Q)WebChannel
- 19. Lex和Yacc和EBNF規範
- 20. 在C程序和shell腳本之間共享頭文件
- 21. python:StringIO之間共享的內存?
- 22. 線程之間的共享內存
- 23. C共享內存
- 24. 在32位和64位進程之間共享共享內存段
- 25. 內存共享.o文件
- 26. 使用內存中的SQLite數據庫在C++和C#之間共享數據?
- 27. 進程之間不共享共享內存
- 28. 通過共享內存進程之間共享指針IPC
- 29. lex yacc nonterminal circularity
- 30. lex/yacc simple Q