在YACC,Lex和C文件之间共享内存

时间:2010-03-14 04:32:06

标签: c bison yacc lex flex-lexer

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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()访问额外的数据。