C++;递归下降解析中使用的n元树实现 我还是有点新的C++,所以请容忍我。我正在为一种被称为Core的假设语言实现一个解释器,它由BNF语法描述。到目前为止,我已经实现了一个令牌发生器,它为我提供了一个表示核心程序的令牌队列。我现在正在编写解析器/执行器,它从标记器获取输出,并使用递归下降解析来填充ParseTree类(我必须设计)的对象。我了解如何实现这一点的基本原理,但在实现ParseTree类时遇到了困难。核心BNF描述的产品通常有2-5个终端/非终端符号,但有些可能有多达20个,因此我需要一个n元树,其中每个节点可以有不同数量的子节点

C++;递归下降解析中使用的n元树实现 我还是有点新的C++,所以请容忍我。我正在为一种被称为Core的假设语言实现一个解释器,它由BNF语法描述。到目前为止,我已经实现了一个令牌发生器,它为我提供了一个表示核心程序的令牌队列。我现在正在编写解析器/执行器,它从标记器获取输出,并使用递归下降解析来填充ParseTree类(我必须设计)的对象。我了解如何实现这一点的基本原理,但在实现ParseTree类时遇到了困难。核心BNF描述的产品通常有2-5个终端/非终端符号,但有些可能有多达20个,因此我需要一个n元树,其中每个节点可以有不同数量的子节点,c++,parsing,data-structures,tree,C++,Parsing,Data Structures,Tree,我认为ParseTree类不一定需要使用树来实现,但这似乎是最有意义的(是否有更好/更简单的不同数据结构?)。我不知道STL中有任何容器能满足我的需要。我已经看过Boost属性树,但从我所知道的来看,它也不起作用。如果可能的话,我宁愿不要重新发明轮子,也不要从头开始实现树。此外,除了Boost之外,我无法使用任何外部库,这也限制了我的使用。实现ParseTree的最佳方法是什么?有什么好的预制树实现我可以使用吗?我建议使用“左子右兄弟”二叉树来表示解析树。它是n元树的替换。任何n元树都可以使用“

我认为ParseTree类不一定需要使用树来实现,但这似乎是最有意义的(是否有更好/更简单的不同数据结构?)。我不知道STL中有任何容器能满足我的需要。我已经看过Boost属性树,但从我所知道的来看,它也不起作用。如果可能的话,我宁愿不要重新发明轮子,也不要从头开始实现树。此外,除了Boost之外,我无法使用任何外部库,这也限制了我的使用。实现ParseTree的最佳方法是什么?有什么好的预制树实现我可以使用吗?

我建议使用“左子右兄弟”二叉树来表示解析树。它是n元树的替换。任何n元树都可以使用“第一个子,下一个兄弟”二叉树表示

概念如下: 如果A有三个子项:B、C和D,C有两个子项E和F,如下所示

              A
            / | \
           B  C  D
              /\
             E  F
这可以表示为

              A
             /
             B
              \
               C
              / \
             E   D
              \
               F
i、 e.子节点总是转到左节点,兄弟节点总是转到右节点。它也很容易构建,并且该树的预序遍历与n元树的预序遍历相同

n元树预序遍历:

display (node, level) {
    if (!node) return;
    print node;
    display (node->left, level+1);
    display (node->right, level+1);
}
子-兄弟二叉树预序travesal

display (node, level) {
    if (!node) return;
    print node;
    display (node->left, level+1);
    display (node->right, level);
}
如何构建此树:

1. Throw your terminals and non-terminals in a Stack.
2. When you want to combine n nodes under parent node 'p', pop 'n' elements from stack, making the last pop as the right child of the current pop.
3. Finally make the nth pop the left child of node 'p'.

你的问题是关于数据结构,而不是递归下降解析。听起来像是很多遍历,这种类型的树有什么好处?@hexist:“节点”的结构很简单。在构建子级数量未知的AST时,这非常有效,因为我们只需要维护2个指针(左、右)。另外,如果我没记错的话,为了构建一个口译员,兄弟姐妹经常被访问,这在这种情况下应该很容易。啊,我明白了,你总是知道你与兄弟姐妹的相对位置,在某些情况下当然是好的。我同意这个答案。我以前用这种树就是为了这个目的。