什么是语法树?
其中每个叶子节点描述一个操作数,每个内部节点描述一个运算符。语法树是语法分析树的简写形式。
示例 1 - 为字符串 a + b ∗ c − d 绘制语法树。
构建语法树的规则
语法树中的每个节点都可以作为具有多个字段的数据执行。在运算符的节点中,一个字段识别运算符,其余字段包含指向操作数节点的指针。运算符称为节点的标签。以下函数用于为具有二元运算符的表达式创建语法树的节点。每个函数都返回指向最近生成的节点的指针。
mknode (op, left, right) - 它生成一个带有标签 op 的运算符节点,以及两个包含指向左节点和右节点的指针的字段。
mkleaf (id, entry) - 它生成一个带有标签 id 的标识符节点,以及包含 entry 的字段,entry 是指向标识符符号表条目的指针。
mkleaf (num, val) - 它生成一个带有标签 num 的数字节点,以及包含 val 的字段,val 是数字的值。例如,为表达式 a − 4 + c 构建语法树。在这个序列中,p1、p2、……p5分别是指向标识符 'a' 和 'c' 的符号表条目的指针。
p1− mkleaf (id, entry a); p2− mkleaf (num, 4); p3− mknode ( ′−′, p1, p2) p4− mkleaf(id, entry c) p5− mknode(′+′, p3, p4);
树以自底向上的方式生成。函数调用 mkleaf (id, entry a) 和 mkleaf (num 4) 为 a 和 4 构造叶子节点。指向这些节点的指针使用 p1 和 p2 存储。然后,调用 mknodes (′−′, p1, p2 ) 创建内部节点,其中 a 和 4 的叶子作为子节点。语法树将是
语法树的语法制导翻译
产生式 | 语义动作 |
---|---|
E → E(1) + E(2) | {E. VAL = Node (+, E(1). VAL, E(2). VAL)} |
E → E(1) ∗ E(2) | {E. VAL = Node (∗, E(1). VAL, E(2). VAL)}) |
E → (E(1)) | {E. VAL = E(1). VAL} |
E → E(1) | {E. VAL = UNARY (−, E(1). VAL} |
E → id | {E. VAL = Leaf (id)} |
Node (+, 𝐄(𝟏), 𝐕𝐀𝐋, 𝐄(𝟐). 𝐕𝐀𝐋) 将创建一个标记为 + 的节点。
E(1). VAL &E(2). VAL 是该节点的左子节点和右子节点。
类似地,Node (∗, E(1). VAL, E(2). VAL) 将使语法为 −
函数 UNARY (−, E(1). VAL) 将创建一个节点 –(一元减号),并且 E(1). VAL 将是其唯一的子节点。
函数 LEAF (id) 将创建一个带有标签 id 的叶子节点。
示例 2 - 为表达式构建语法树。
a = b ∗ −c + d
解决方案
示例 3 - 为语句构建语法树。
如果 a = b 则 b = 2 * c
解决方案
示例 4 - 考虑以下代码。绘制其语法树
如果 x > 0 则 x = 2 * (a + 1) 否则 x = x + 1。
示例 5 - 为以下算术表达式 a * (b + c) – d /2 绘制语法树。此外,将给定表达式写成后缀形式。
后缀表示法
a b c + * d 2 / -