在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 --> "-"
但是我不知道他是怎么得到这个结果的。当我尝试自己删除左递归时,我采用以下方式进行操作:
首先,我将没有左递归的产品归为一组,而另一组(左递归)为另一组:
E --> E "+" E | E "-" E | E "*" E | E "/" E | E "^" E // L-recursive E --> v | "(" E ")" | "-" E
接下来,我给它们命名,并提供便于操作的因素:
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 --> "-"
现在,我只需要处理前两个作品,现在更容易处理它们。
我通过从非L递归生产(简称
P
为Primary表达式)开始,然后由可选的Tail 重写前两个生产T
,我将其定义为原始生产的其余部分,减去第一个左递归非终结符(即),B E
然后是TailT
,或者可以为空:E --> P T T --> B E T |
(请注意尾部为空)。
我现在可以用EBNF重写这两个作品,如下所示:
E --> P {B E}
这是笔者拿到近的东西,但我
E
不是P
有零或更多的重复模式(尾部)内。我得到的其他作品与他得到的完全相同:P --> v | "(" E ")" | U E B -> "+" | "-" | "*" | "/" | "^" U -> "-"
但是我在这里也
E
代替P
了第一部作品P
。
所以,我的问题是:我想念什么?我现在需要进行什么语法上的代数转换才能获得与授课者相同的形式?我尝试用替代E
,但只会使我陷入循环。我怀疑,我需要以某种方式替代P
了E
,但我不知道任何法律转型来证明它。也许您知道最后缺少的步骤是什么?
请考虑使用LaTeX进行格式化。看到这里的入门。(有关此情况下LaTeX适用性的讨论,请参见此处。)
—
拉斐尔