在YACC、Lex和C文件之间共享内存
我有一个YACC(Bison)语法、一个Lex(Flex)标记器和一个C程序,其中我需要共享一个在YACC、Lex和C文件之间共享内存,c,bison,yacc,lex,flex-lexer,C,Bison,Yacc,Lex,Flex Lexer,我有一个YACC(Bison)语法、一个Lex(Flex)标记器和一个C程序,其中我需要共享一个struct(或者任何变量)。目前,我在语法文件中声明实际对象,并在需要它的任何地方(也就是说,我的C源文件)声明它,通常使用指针来操作它。我在C文件和语法文件之间有一个共享的头文件(和实现),其中包含一些用于操作数据结构的函数。这很有效,但感觉有点不舒服。语法和程序之间有更好的共享内存的方法吗?头文件在需要外部声明的源文件之间共享外部声明通常是最好的方法。主要的替代方案是提供对它的“功能访问”——即
struct
(或者任何变量)。目前,我在语法文件中声明实际对象,并在需要它的任何地方(也就是说,我的C源文件)声明它,通常使用指针来操作它。我在C文件和语法文件之间有一个共享的头文件(和实现),其中包含一些用于操作数据结构的函数。这很有效,但感觉有点不舒服。语法和程序之间有更好的共享内存的方法吗?头文件在需要外部声明的源文件之间共享外部声明通常是最好的方法。主要的替代方案是提供对它的“功能访问”——即某种“获取值”和“设置值”函数(或一组函数)。这通常是矫枉过正。确保在语法(定义变量的地方)以及lexer和其他代码中包含标题,以便尽快发现不一致之处。如果您想坚持使用标准(POSIX)lex/yacc,那么您唯一的选择就是使用全局变量/函数。如果您对使用Bison和Flex扩展还满意,那么有几种方法可以传递变量,主要包括向yyparse()和yylex()添加额外的参数
在Bison中,这是通过%lex param和%parse param实现的
%parse-param { struct somestruct *mystruct }
%lex-param { struct somestruct *mystruct }
在Flex中,有两种不同的机制,这取决于您是否需要可重入lexer。假设使用默认(不可重入)选项,则需要重新定义YY_DECL:
%{
#define YY_DECL int yylex(struct somestruct *mystruct)
%}
在可重入的Flex lexer中,可以通过Flex携带的scanner结构添加额外的参数以保持其状态。您需要定义YY_EXTRA_类型;可以通过yyget/set_extra()访问额外数据