我有这样的语法
S->S+S|SS|(S)|S*|a
我想知道如何消除这个语法的左递归,因为S+S
是真的混乱...
我有这样的语法
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
我们可以这样写
小号--->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| ^