打印解析树作为c语言的动态列表

时间:2013-04-19 16:52:58

标签: parsing compiler-construction lr1

我在C中编写了一个代码来实现LR(1)解析表,但是现在我在打印解析树时遇到了问题。我们如何在C中做到这一点?树可以有变量子,因为解析算法是自下而上的,我不知道从哪里开始。我想让它看起来像pstree命令的输出或类似的东西。

谢谢

1 个答案:

答案 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的高度和终端本身的宽度开始。在每个减少规则中:

  • 光标向右移动,直到它位于每个孩子的右侧;

  • 光标向上移动到第一个孩子的底部

  • 对于每个孩子,从其右下角到光标所在的列绘制一条水平线,然后绘制一条垂直线,直到到达下一个孩子的行。在最后一个孩子,打印缩小的非终端名称,并记录所得到的非终端的高度和宽度。