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

标签 parsing compiler-construction tree ppl

这是正确的递归语法:

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

这是左递归语法:

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

这些语法会为字符串 B + C + A 生成相同的解析树吗? 下图是左递归的。

enter image description here

但是,我绘制了右递归的解析树,节点位置之间有点不同。我不知道我所做的是否正确。所以我想知道左递归和右递归会产生两个不同的解析树或者应该是相同的解析树。请帮忙澄清这个问题。谢谢。

最佳答案

左右递归不会产生相同的树。
从语法中你可以很容易地看出A+B+C将在“顶层”有 <term> <op> <exp><exp> <op> <term> (“exp”在一种情况下为“B+C”,在另一种情况下为“A+B”。

只有在所有产品都直接匹配的小情况下,树才会相同。
(例如 A (跳过 assign )将是 <exp> --> <term> --> <factor> --> <id>

关于parsing - 左递归和右递归是否产生相同的解析树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36182000/

相关文章:

java - "intelligently"解析用户输入参数

PHP 将 GZ 文件解析为 XML

java - JodaTime 打印周期错误?

c++ - Code::Blocks 无法找到标准库 header ?

从后缀表达式创建树

c - C 中的递归和树搜索?

python - 如何在 Python 中重新格式化时间戳

c++ - 为什么C++偏向析构函数异常?

c++ - 我的 Prim 算法 (MST) 在矩阵中的运行速度比在列表中快得多

c - 为什么编译器无法检测全局变量是否被另一个线程更改?