算术表达式语法转换


9

Theodore Norvell(1999)的文章“ 递归下降解析表达式”中,作者从算术表达式的以下语法入手:

E --> E "+" E | E "-" E | "-" E | E "*" E | E "/" E | E "^" E | "(" E ")" | v

这很糟糕,因为它是模棱两可的并且是左递归的。因此,他从移除左递归开始,其结果如下:

E --> P {B P}
P --> v | "(" E ")" | U P
B --> "+" | "-" | "*" | "/" | "^"
U --> "-"

但是我不知道他是怎么得到这个结果的。当我尝试自己删除左递归时,我采用以下方式进行操作:

  1. 首先,我将没有左递归的产品归为一组,而另一组(左递归)为另一组:

    E --> E "+" E | E "-" E | E "*" E | E "/" E | E "^" E     // L-recursive
    E --> v | "(" E ")" | "-" E
  2. 接下来,我给它们命名,并提供便于操作的因素:

    E --> E B E  // L-recursive; B stands for "Binary operator"
    E --> P  // not L-recursive; P stands for "Primary Expression"
    P --> v | "(" E ")" | U E   // U stands for "Unary operator"
    B --> "+" | "-" | "*" | "/" | "^"
    P --> "-"

    现在,我只需要处理前两个作品,现在更容易处理它们。

  3. 我通过从非L递归生产(简称P为Primary表达式)开始,然后由可选的Tail 重写前两个生产T,我将其定义为原始生产的其余部分,减去第一个左递归非终结符(即),B E然后是Tail T或者可以为空:

    E --> P T
    T --> B E T |

    (请注意尾部为空)。

  4. 我现在可以用EBNF重写这两个作品,如下所示:

    E --> P {B E}

    这是笔者拿到近的东西,但我E不是P有零或更多的重复模式(尾部)内。我得到的其他作品与他得到的完全相同:

    P --> v | "(" E ")" | U E
    B -> "+" | "-" | "*" | "/" | "^"
    U -> "-"

    但是我在这里也E代替P了第一部作品P

所以,我的问题是:我想念什么?我现在需要进行什么语法上的代数转换才能获得与授课者相同的形式?我尝试用替代E,但只会使我陷入循环。我怀疑,我需要以某种方式替代PE,但我不知道任何法律转型来证明它。也许您知道最后缺少的步骤是什么?


请考虑使用LaTeX进行格式化。看到这里的入门。(有关此情况下LaTeX适用性的讨论,请参见此处。)
拉斐尔

Answers:


8

缺少的步骤:

E --> P T
T --> B E T |

在T中重写E:

E --> P T
T --> B P T T | 

简化T:

E --> P T
T --> B P T | 

相当于:

E --> P T
T --> {B P}

在那里。


1
感谢您提供一个很好的答案:-)现在,我看到了我所错过的东西:我以另一种方式对其进行了归类,这就是问题所在。但是,我仍然不了解其中的一小部分:您如何知道可以安全地将Ts合并为一个T?有什么规定吗?(我怀疑它可能是某种方式类似于布尔代数的逻辑,说:“AA = A”的规则。)
SasQ

顺便说一句,为什么这篇文章从cstheory.sx移到了这里,有什么区别?我想知道避免将来出错。
2012年

2
@SasQ CSTheory仅适用于理论计算机科学中的研究级问题,有关详细信息,请参阅CSTheory的FAQ。
Juho 2012年

1
@SasQ:生成,也生成。更一般地说,对于种语言,。请注意,空单词作为右手至关重要。这并不适用于所有语法片段,例如。X * Ť X Ť | ε 大号* 大号* = 大号*大号ε 大号+ 大号+大号+TxTTεxTxTεLL=LLεL+L+L+
拉斐尔

@Raphael:这与幂等规则有关*吗?我在《龙书》(3.3,第91页)中看到了x** = x*。这是您使用的相同规则吗?
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.