我有一个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
成为我班级的数据成员,而不依赖于全局变量? 感谢您的时间和帮助。
答案 0 :(得分:2)
<强> 1。有没有办法让我的班级成为数据成员而不依赖于全局变量?
您可以使用%parse-param
向yyparse
原型添加一个(或多个)参数。特别是,您可以将指针传递给yyparse
并使用解析结果填充它。您可能还想使yyparse
“纯粹”(可重入)。请参阅野牛手册中的"The Parser Function"和"A Pure Parser"部分(也可能以info bison
形式提供)
或者,您可以使用bison
生成C ++代码的功能,这将有效地完成所有这些。
<强> 2。此外,是否可以隐藏用户的Bison / Flex代码?
您可以在生成的代码中插入namespace {
块,但需要一些手动(或可编写脚本)的生成后操作。 (例如,将野牛和弹性输出连接成一个单独的翻译单元。)尽管不是很困难。