代码之家  ›  专栏  ›  技术社区  ›  sczizzo

在yacc、lex和c文件之间共享内存

  •  4
  • sczizzo  · 技术社区  · 16 年前

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

    2 回复  |  直到 13 年前
        1
  •  4
  •   Jonathan Leffler    14 年前

    通常,在需要它的源文件之间共享外部声明的头文件是最好的方式。主要的选择是提供对它的“功能访问”——也就是说,某种类型的“get value”和“set value”函数(或一组函数)。这通常是杀伤力过大。确保在语法(定义变量的地方)以及lexer和其他代码中包含头部,以便尽快发现不一致。

        2
  •  2
  •   rz0    16 年前

    如果您想坚持使用标准(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 U decl:

    %{
    #define YY_DECL int yylex(struct somestruct *mystruct)
    %}
    

    在可重入的flex-lexer中,可以通过flex携带的scanner结构添加额外的参数以保持其状态。您需要定义YY_Extra_类型;可以通过YYGET/SET_Extra()访问额外数据。