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

Parsing 将给定的二义算术表达式语法转换为无二义LL(1),parsing,grammar,context-free-grammar,formal-languages,Parsing,Grammar,Context Free Grammar,Formal Languages,在这学期,我有一门关于编译器的课程,我们目前正在学习语法——不同的语法和类型的解析器。我遇到了一个我不能准确理解的问题,或者至少我不能确保我做得正确。我已经做了两次尝试,并找到了反例。 对于算术表达式,我有一个模棱两可的语法: E→ E+E | E-E | E*E | E/E | E^E |-E |(E)| id | num,其中^代表力量 我弄明白了应该优先考虑什么。最高优先级是括号,然后是幂,然后是一元负号,然后是乘法和除法,然后是加法和减法。我被要求将其转换为等价的LL(1)语法。所以我写

在这学期,我有一门关于编译器的课程,我们目前正在学习语法——不同的语法和类型的解析器。我遇到了一个我不能准确理解的问题,或者至少我不能确保我做得正确。我已经做了两次尝试,并找到了反例。 对于算术表达式,我有一个模棱两可的语法: E→ E+E | E-E | E*E | E/E | E^E |-E |(E)| id | num,其中^代表力量

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

  • E→ E+A | E-A | A
  • A→ A*B | A/B | B
  • B→ -C | C
  • C→ D^C|D
  • D→ (E) | id | num
这个问题似乎并不等同于第一个语法,尽管它不是模棱两可的。例如:给定语法可以识别输入:--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

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

您能重新检查您编写的内容吗?我试图遵循逻辑,但除了C本身之外,右边没有C。我猜你想写点别的更新的东西:谢谢!我将尝试在一些特殊情况下测试这种语法,但乍一看似乎还可以,而且我可以注意到关于负号的修正。我将按照我在评论中所说的进行测试。谢谢顺便问一下,考虑到优先级,你为什么要这么做?我已经看到,在大多数语言中,power具有更高的优先级,Excel和其他程序除外,我现在记不起来了。但是,考虑到支持功率的编程语言作为操作符,大多数,如我所读的,考虑功率较高。priority@LukaBulatovic我想这真的可以归结为你的具体问题,我在编辑这篇文章时有一个小问题,你会如何修改以交换这些优先级?