我在C中编写了一个代码来实现LR(1)解析表,但是现在我在打印解析树时遇到了问题。我们如何在C中做到这一点?树可以有变量子,因为解析算法是自下而上的,我不知道从哪里开始。我想让它看起来像pstree
命令的输出或类似的东西。
谢谢
答案 0 :(得分:0)
您会发现在解析器中构造解析树更容易,并在解析完成后以递归方式自上而下打印它。这有几个优点:首先,您不仅限于解析树,而是可以生成abstract syntax tree,这通常更清晰。其次,您可以以您喜欢的任何形式生成树。
我打算插入一个证据,证明在你从左到右解析时不可能绘制一个解析树,但令我惊讶的是,我确信如果你放松规则,它是可能的一点:你必须能够上下左右移动光标,但你可以在没有任何叠印的情况下完成。要做到这一点,你必须在左边缘或顶部绘制带有树叶(终端)的树,然后你可以通过绘制每个孩子的线来绘制缩小,并记住什么是“连接点”结果节点是。我不知道这对于刚开始解析的人来说是否是一个合适的编程练习,但即使使用控制台应用程序也是如此。
以下是“反向pstree”图表的示例:
(41*x) + (27/y) - sin(2*pi*z);
(───────────────────────┐
41─factor─term┐ │
*─────────────┤ │
x─factor──────┴term─expr┤
)───────────────────────┴factor─term─expr┐
+────────────────────────────────────────┤
(───────────────────────┐ │
27─factor─term┐ │ │
/─────────────┤ │ │
y─factor──────┴term─expr┤ │
)───────────────────────┴factor─term─────┴expr┐
-─────────────────────────────────────────────┤
sin─────────────────────────┐ │
(───────────────────────────┤ │
2─factor─term┐ │ │
*────────────┤ │ │
pi─factor────┴term┐ │ │
*─────────────────┤ │ │
z─factor──────────┴term─expr┤ │
)───────────────────────────┴factor─term──────┴expr
用于生成的算法保持每个堆栈项的宽度和高度;终端以1的高度和终端本身的宽度开始。在每个减少规则中:
光标向右移动,直到它位于每个孩子的右侧;
光标向上移动到第一个孩子的底部
对于每个孩子,从其右下角到光标所在的列绘制一条水平线,然后绘制一条垂直线,直到到达下一个孩子的行。在最后一个孩子,打印缩小的非终端名称,并记录所得到的非终端的高度和宽度。