C N- ARY树实现用于递归下降解析

C++ n-ary tree implementation for use in recursive descent parsing

本文关键字:递归 用于 ARY 实现      更新时间:2023-10-16

我仍然对C 有些新奇,所以请忍受我。我正在为一种称为核心语法的假设语言实施解释器,由BNF语法描述。到目前为止,我已经实现了一个令牌,它为我提供了代表核心程序的代币队列。我现在正在编写解析器/执行者的过程中,该解析器/执行程序从令牌器中获取输出,并使用递归下降解析来填充Parsetree类(我必须设计)的对象。我了解如何执行此操作的基本原理,但是在实施Parsetree类方面遇到了麻烦。核心BNF描述的作品通常具有2-5个终端/非末端符号,但有些可能具有20个端子符号,因此我需要一个N- ARY树,每个节点都可以有不同数量的孩子。

我想Parsetree类不一定需要使用树进行实现,但这似乎是最有意义的(是否有更好/更容易的数据结构?)。我不知道STL中的任何容器都适合我所需的账单。我已经看了Boost Property树,但据我所知,这也无法正常工作。如果可能的话,我宁愿不重新发明轮子并从头开始实现树。另外,除了Boost之外,我无法使用任何外部图书馆,而我受到限制。实施我的parsetree的最佳方法是什么?我可以使用任何好的预制树实现吗?

我建议使用'左子女,右兄弟姐妹'二进制树代表解析树。它是N- Ary树的替代品。任何n-ary树都可以使用"第一个孩子,下一个兄弟姐妹"二进制树表示。

这个概念如下:如果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'.