左递归消去



我有这个语法

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

我想知道如何从这个语法中消除左递归,因为S+S真的很令人困惑…

让我们看看是否可以简化给定的语法。

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

你会发现这在处理左递归消除时很有用。

我的答案是使用这个参考

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

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

我们可以写成

——>年代α<子> 1 |年代α<子> 2 |年代α<子> 3 | 1β<子> |β2 <子>

转换为等效非递归语法的规则:

S -> β1 | β2
Z—> α12 | α3
Z—> α1Z |α2Z | α3Z
S -> β1Z | β2Z

,

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

And β -productions not start started with S:

β1 = a
β2 = (S)

不含左递归的语法:

非左递归产物S --> βn

S -->  a | (S)   

引入新的变量Z,产生如下结果:Z—> αn和Z—> αnZ

Z --> +S | S | * 
and 
Z --> +SZ | SZ | *Z  

S新产品:S -> βnZ

S -->  aZ | (S)Z     

第二种形式(答案)

产品Z --> +S | S | *Z --> +SZ | SZ | *Z可以合并为Z --> +SZ | SZ | *Z| ^,其中^为空符号。

Z --> ^用于从生产规则中删除Z

所以第二个答案:

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

最新更新