什么是语法树?


其中每个叶子节点描述一个操作数,每个内部节点描述一个运算符。语法树是语法分析树的简写形式。

示例 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 / -

更新于: 2023 年 10 月 26 日

26K+ 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告