C N- ARY树实现用于递归下降解析
C++ n-ary tree implementation for use in recursive descent parsing
我仍然对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'.
相关文章:
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 递归函数,用于查找 2 个整数之间的最大值
- 为什么我的递归最长递增子序列函数不适用于大输入?
- 递归函数,用于计算 BST 中具有两个子节点的节点数
- 递归解决方案,用于显示线性链表数组
- 递归函数用于计算 n 个数字之和的意外输出
- 一个递归函数,用于计算 n-airy 树的高度
- 大o用于以下递归解决方案
- 递归函数,用于计算数字中的位数
- 递归函数,用于使用位掩码 c++ 显示集合的所有子集
- 用于成员函数检测的递归type_traits
- 该递归代码用于计算指数的运行时间是多少
- C++用于理顺递归的模板技术
- C++,一个通用递归模板函数,用于遍历树状结构
- 我的递归算法中的问题,用于查找所有最短、唯一的路径
- 用于列出子目录中所有文件的递归功能
- C N- ARY树实现用于递归下降解析
- 可以valgrind报告丢失块的内存地址(用于调试递归函数调用)
- 用于反转数字的递归
- decltype用于递归变元函数模板的返回类型