4

我有一个 YACC (Bison) 语法、一个 Lex (Flex) 标记器和一个 C 程序,我需要在其中共享一个struct(或实际上任何变量)。目前,我在语法文件中声明实际对象,并extern在我需要它的任何地方(也就是说,我的 C 源文件),通常使用指针来操作它。我在 C 文件和语法文件之间有一个共享的头文件(和实现)文件,其中的函数对操作我的数据结构很有用。这行得通,但感觉有点不舒服。有没有更好的方法在语法和程序之间共享内存?

4

2 回答 2

4

通常,在需要它的源文件之间共享外部声明的头文件是最好的方法。主要的替代方法是为其提供“功能访问”——即某种“获取值”和“设置值”功能(或一组功能)。这通常是矫枉过正。确保在语法(定义变量的地方)以及词法分析器和其他代码中包含标题,以便尽快发现不一致之处。

于 2010-03-14T04:43:17.767 回答
2

如果您想坚持使用标准 (POSIX) lex/yacc,那么您唯一的选择就是使用全局变量/函数。如果您对使用 Bison 和 Flex 扩展感到满意,有几种方法可以传递变量,其中主要涉及向 yyparse() 和 yylex() 添加额外的参数。

在 Bison 中,这是通过 %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() 访问。

于 2010-03-14T11:32:50.173 回答