首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以不使用全局变量而返回使用Bison构建的AST吗?

可以不使用全局变量而返回使用Bison构建的AST吗?
EN

Stack Overflow用户
提问于 2014-02-01 19:21:08
回答 1查看 929关注 0票数 3

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

parser.y

代码语言:javascript
复制
%{
      mynamespace::AST * ast;
%}

%%
PARSER
%%

目前,我构建了该树并以下列方式使用它:

A.hpp

代码语言:javascript
复制
#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代码?

谢谢你的时间和帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-01 20:09:50

1.是否有一种使ast成为类的数据成员而不依赖于全局变量的方法?

您可以使用%parse-paramyyparse原型添加一个(或多个)参数。特别是,您可以传递一个指向yyparse的指针,并用解析结果填充它。您可能还希望使yyparse“纯”(可重入)。参见野牛手册中的“解析函数”“纯粹的分析者”部分(也可能作为info bison提供)。

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

2.另外,是否可以向用户隐藏Bison/Flex代码?

您可以在生成的代码中插入namespace {块,但它需要一些手动(或可编写脚本的)后期操作。(例如,将野牛和flex输出连接到一个翻译单元中。)不过,一点也不难。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21502425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档