Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为解析树实现创建一个公共头文件_C++_Bison_Abstract Syntax Tree - Fatal编程技术网

C++ 为解析树实现创建一个公共头文件

C++ 为解析树实现创建一个公共头文件,c++,bison,abstract-syntax-tree,C++,Bison,Abstract Syntax Tree,我正在野牛城做一棵解析树。目前,每个非终端有一个类,每个产品有一个子类。问题是我每个类有一个标题,所以它们很多。我认为解决方案是创建一个包含所有头的公共头 当前项目结构示例: -ast --program.hh --decl.hh --.. --.. --.. --constants.hh 公共标头(例如common_header.hh)如下所示: #ifndef COMMON_HEADER_HH #define COMMON_HEADER_HH #include "program.hh" #

我正在野牛城做一棵解析树。目前,每个非终端有一个类,每个产品有一个子类。问题是我每个类有一个标题,所以它们很多。我认为解决方案是创建一个包含所有头的公共头

当前项目结构示例:

-ast
--program.hh
--decl.hh
--..
--..
--..
--constants.hh
公共标头(例如
common_header.hh
)如下所示:

#ifndef COMMON_HEADER_HH
#define COMMON_HEADER_HH
#include "program.hh"
#include "decl.hh"
// a lot of includes here
#include "constants.hh"
#endif //COMMON_HEADER_HH
所以在Bison中,我只包含了
#包含了“common_header.hh”
,问题是我读到这被认为是不好的做法,因为它会产生开销并增加编译时间。这个案子有理由这样做吗?在C++(和C)中,分析器总是使用所有的头。

,合理地将每个翻译单元的大小减到最小是一个好的做法。创建包含许多其他头文件的单个头文件通常是一种糟糕的做法

但是,您似乎描述了一种情况,即任何包含这组标题的翻译单元都需要包含整个标题组。在这种情况下,无论你是直接还是通过一个怪物头间接包含它们,都无关紧要

不过,只有在许多翻译单元中使用怪物标题时,才有意义创建怪物标题。如果它只包含在一个翻译单元中,那么与显式地包含其中的所有标题相比,没有任何优势


monster头的另一个潜在优势是,您可能能够在构建时生成它,因为您的构建系统中已经有一个Bison语法文件列表。但这只是一个小小的方便,因为添加一个新的语法文件在添加使用它的代码之前是没有用的。

如果是编译器,那么公共头通常是最好的。Fwiw,你所描述的不是AST。这是一个解析树。如果您正在编写编译器,则需要AST。@Gene:CST/AST的区别没有您预期的那么有用。看见解析树或AST的物理表示可能是相同的。@IraBaxter我构建了一些编译器,并尝试了两者。AST提供了一个更干净的实现。