用于递归下降解析的C ++ n-ary树实现

时间:2012-10-26 04:10:47

标签: c++ parsing data-structures tree

我仍然是C ++的新手,所以请耐心等待。我正在为一种名为Core的假设语言实现一个解释器,这种语言由BNF语法描述。到目前为止,我已经实现了一个tokenizer,它为我提供了一个代表Core程序的令牌。我现在正在编写Parser / Executer,它从标记生成器获取输出并使用它来使用递归下降解析来填充ParseTree类的对象(我必须设计)。我理解如何执行此操作的基本原理,但是在实现ParseTree类时遇到了问题。 Core BNF描述的产品通常具有2-5个终端/非终端符号,但是一些可能具有多达20个,因此我需要一个n-ary树,其中每个节点可以具有不同数量的子节点。

我认为ParseTree类不一定需要使用树来实现它,但这似乎最有意义(是否存在可能更好/更容易的不同数据结构?)。我不知道STL中的任何容器符合我需要的费用。我已经查看了Boost属性树,但是我可以告诉它也无法工作。如果可能的话,我宁愿不重新发明轮子并从头开始实施一棵树。另外,除了Boost之外,我无法使用任何外部库。实现ParseTree的最佳方法是什么?我可以使用任何好的预制树实现吗?

1 个答案:

答案 0 :(得分:7)

我建议使用'left child,right sibling'二叉树来表示解析树。它是n-ary树的替代品。任何n-ary树都可以使用'first child,next sibling'BINARY树来表示。

概念如下: 如果A有三个孩子:B,C和D和C有2个孩子E和F如下

              A
            / | \
           B  C  D
              /\
             E  F

这可以表示为

              A
             /
             B
              \
               C
              / \
             E   D
              \
               F

即。孩子们总是去左边的节点和兄弟姐妹到右边的节点。它也很容易构建,这棵树的预先遍历与n-ary树的预先遍历相同。

n-ary树预订遍历:

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'.