左递归消除(Left recursion elimination)

2019-08-04 16:05发布

我有这样的语法

S->S+S|SS|(S)|S*|a

我想知道如何消除这个语法的左递归,因为S+S是真的混乱...

Answer 1:

让我们看看我们是否能够简化定的文法。

S -> S*|S+S|SS|(S)|a

我们可以把它写成;

S -> S*|SQ|SS|B|a
Q -> +S
B -> (S)

现在,您可以消除自己熟悉的领域左递归。

S  ->  BS'|aS'
S' ->  *S'|QS'|SS'|e
Q  ->  +S
B  ->  (S)

需要注意的是e是小量/λ。

我们已经移除了左递归,所以我们不再有需要Q和B的

S  ->  (S)S'|aS'
S' ->  *S'|+SS'|SS'|e

与左递归消除打交道时,你会发现这很有用 。



Answer 2:

运用理论从我的回答这个参考

如何消除上下文无关文法左递归。

S -->  S+S | SS | S*    |        a | (S)
      --------------            -------   
      Sα form                   β form    
      Left-Recursive-Rules      Non-Left-Recursive-Rules       

我们可以这样写

小号--->Sα1 | Sα2 | Sα3 | β1 | β2

规则在相当于非递归语法转换:

小号--->β1 | β2
ž--->α1 | α2 | α3
ž--->α1 Z - | α2 Z | α3 Z
小号--->β1 Z - | β2 Z

哪里

α1 = + S
α2 = S
α3 = *

β -productions没有开始启动S

β1 =一个
β2 =(S)

语法无左递归:

非左递归制作的S - >βN

S -->  a | (S)   

引入新的变量Z与以下制作位:Z --->αN和Z - >αN个 Z

Z --> +S | S | * 

and 

Z --> +SZ | SZ | *Z  

而新的S制作:S - >βN个 Z

S -->  aZ | (S)Z     

第二种形式(答案)

制作Z --> +S | S | * Z --> +S | S | * Z --> +S | S | *Z --> +SZ | SZ | *Z Z --> +SZ | SZ | *Z Z --> +SZ | SZ | *Z可以组合成Z --> +SZ | SZ | *Z| ^ Z --> +SZ | SZ | *Z| ^ Z --> +SZ | SZ | *Z| ^其中^是空符号。

Z --> ^使用删除Z从生产规则。

所以第二个答案

S --> aZ | (S)Z S --> aZ | (S)Z Z --> +SZ | SZ | *Z| ^ Z --> +SZ | SZ | *Z| ^



文章来源: Left recursion elimination