我有一个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
}
};
}ast成为类的数据成员,而不依赖于全局变量?谢谢你的时间和帮助。
发布于 2014-02-01 20:09:50
1.是否有一种使ast成为类的数据成员而不依赖于全局变量的方法?
您可以使用%parse-param向yyparse原型添加一个(或多个)参数。特别是,您可以传递一个指向yyparse的指针,并用解析结果填充它。您可能还希望使yyparse“纯”(可重入)。参见野牛手册中的“解析函数”和“纯粹的分析者”部分(也可能作为info bison提供)。
或者,您可以使用bison生成C++代码的能力,这将有效地完成所有这些工作。
2.另外,是否可以向用户隐藏Bison/Flex代码?
您可以在生成的代码中插入namespace {块,但它需要一些手动(或可编写脚本的)后期操作。(例如,将野牛和flex输出连接到一个翻译单元中。)不过,一点也不难。
https://stackoverflow.com/questions/21502425
复制相似问题