左递归和右递归是否产生相同的解析树?

时间:2016-03-23 15:16:32

标签: parsing compiler-construction tree ppl

这是正确的递归语法:

<assign> -> <id> = <exp>
<id> -> A | B | C
<exp> -> <term> + <exp> | <temp>
<term> -> <factor> * <term> | <factor>
<factor> -> ( <exp> ) | <id>

这是Left Decursion Grammar:

<assign> -> <id> = <exp>
<id> -> A | B | C
<exp> -> <exp> + <term> | <term>
<term> -> <term> * <factor> | <factor>
<factor> -> ( <exp> ) | <id>

这些语法是否会为String B + C + A产生相同的解析树? 以下图片适用于左递归。

enter image description here

但是,我为Right Recursion绘制了解析树,它在节点的位置之间有点不同。我不知道我在做什么是正确的。所以我想知道左递归和右递归产生两个不同的解析树或应该是相同的解析树。请帮助澄清这个问题。感谢。

2 个答案:

答案 0 :(得分:3)

左右递归不会产生相同的树 您可以通过A+B+C在&#34;顶级&#39;处理的语法轻松查看。拥有<term> <op> <exp><exp> <op> <term>(&#34; exp&#34;&#34; B + C&#34;在一种情况下&#34; A + B&#34;在另一种情况下。

只有在所有作品产生直接匹配的琐碎案例中,树木才会相同 (例如A(跳过assign)将是<exp> --> <term> --> <factor> --> <id>

答案 1 :(得分:2)

由于两种语法都不同,我希望不同的解析树。正确的递归将交换顶部节点上的加法和单个扩展,标记为<expr> = <expr> + <term>。正确的递归语法将扩展为<expr> = <term> + <expr>,因此两个孩子都会被交换。

如果您正在尝试为数学表达式编写编译器,那么更重要的是运算符优先级,但不确定您要做什么。