是否可以在不使用全局变量的情况下返回使用Bison构建的AST?

时间:2014-02-01 19:21:08

标签: c++ bison

我有一个AST(抽象语法树),用于使用Flex / Bison构建的语法。目前,我使用全局变量访问数据结构。

parser.y

%{
      mynamespace::AST * ast;
%}

%%
PARSER
%%

我目前正在构建树并按以下方式使用它:

A.hpp

#include "ast.hpp"

extern mynamespace::AST * ast;

namespace mynamespace{

extern "C" int yyparse();
extern "C" FILE * yyin;
MyClass A 
{
  void readGrammer( FILE * file)
  {
    yyin = file;
    do{
      yyparse();
    }while(!feof(file))
  }
  void method1()
  {
    //do something with the ast
  }
};
}
  1. 有没有办法让ast成为我班级的数据成员,而不依赖于全局变量?
  2. 此外,是否可以隐藏用户的Bison / FLex代码?
  3. 感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:2)

<强> 1。有没有办法让我的班级成为数据成员而不依赖于全局变量?

您可以使用%parse-paramyyparse原型添加一个(或多个)参数。特别是,您可以将指针传递给yyparse并使用解析结果填充它。您可能还想使yyparse“纯粹”(可重入)。请参阅野牛手册中的"The Parser Function""A Pure Parser"部分(也可能以info bison形式提供)

或者,您可以使用bison生成C ++代码的功能,这将有效地完成所有这些。

<强> 2。此外,是否可以隐藏用户的Bison / Flex代码?

您可以在生成的代码中插入namespace {块,但需要一些手动(或可编写脚本)的生成后操作。 (例如,将野牛和弹性输出连接成一个单独的翻译单元。)尽管不是很困难。