Parsing 协助将语法交换到LL(1)

Parsing 协助将语法交换到LL(1),parsing,grammar,ll,Parsing,Grammar,Ll,我有以下语法 S -> E | S A | A E -> if (C) {S} | if (C) {S} else {S} A -> V := T; T -> a | b V -> x | y C -> V O T | T O V | V O V | T O T O -> < | > S->E|S A|A E->if(C){S}| if(C){S}else{S} A->V:=T; T->a | b V->x | y C->V O T | T

我有以下语法

S -> E | S A | A
E -> if (C) {S} | if (C) {S} else {S}
A -> V := T;
T -> a | b
V -> x | y
C -> V O T | T O V | V O V | T O T
O -> < | >
S->E|S A|A
E->if(C){S}| if(C){S}else{S}
A->V:=T;
T->a | b
V->x | y
C->V O T | T O V | V O V | T O T
O-><|>
由此看来,我说这个语法不是LL(1)是正确的,因为对于规则E,“if(C){S}”可以被左分解,而规则S有一个左递归

解决这个问题的正确方法是什么? 我的想法是:

S -> P
P -> ER | AR
R -> AR | ε
E -> if (C) {S} B
B -> else {S}
A -> V := T;
T -> a | b
V -> x | y
C -> V O T | T O V | V O V | T O T
O -> < | >
S->P
P->ER|AR
R->AR |ε
E->if(C){S}B
B->else{S}
A->V:=T;
T->a | b
V->x | y
C->V O T | T O V | V O V | T O T
O-><|>
Left factoring
E
你建议考虑

E -> if (C) {S} | if (C) {S} else {S}
进入

现在,不再可能解析
if(C){s}
表单,因为
B
不能为空。因此,此转换是不正确的

请考虑这个:

B -> else {S} | ε
删除
S中的直接左递归
你建议替换

S -> E | S A | A

虽然这是一个正确的转换,但以下内容也足够了:

S -> ER | AR
R -> AR | ε

这个问题更适合我。
S -> P
P -> ER | AR
R -> AR | ε
S -> ER | AR
R -> AR | ε