将给定的有歧义的算术表达式语法转换为无歧义的 LL(1)

Converting given ambiguous arithmetic expression grammar to unambiguous LL(1)

在这学期,我有关于编译器的课程,我们目前正在学习语法 - 不同的语法和类型的解析器。我遇到了一个我不能完全弄清楚的问题,或者至少我不能确定我做的是正确的。我已经做了2次尝试并找到了反例。 我得到了算术表达式的这种模棱两可的语法: E → E+E | E-E | E*E | E/E | E^E | -E | (五)|编号 | num ,其中 ^ 代表幂。

我弄清楚了优先事项应该是什么。最高优先级是括号,其次是幂,然后是一元减法,然后是乘法和除法,然后是加法和减法。我被要求将其转换为 等价的 LL(1) 文法。所以我写了这个:

这似乎是第一个语法等价语法的问题,尽管它没有歧义。例如:给定的语法可以识别输入:--5 而我的语法不能。我怎样才能确保涵盖所有情况?我应该如何修改我的语法以与给定的语法等效?提前致谢。

编辑:另外,我当然会消除左递归和左因式分解来制作这个 LL(1),但首先我需要弄清楚我上面问的这个主要部分。

这里有一个适合您的案例

E = E+A | E-A | A
A = A*C | A/C | C
C = C^B | B
B = -B | D
D = (E) | id | num

作为旁注:还要注意您的任务要求,因为 some applications 可能会为一元减号运算符分配比幂二元运算符更高的优先级。