![](/img/trans.png)
[英]Why right-recursive grammar is not appropriate for Bottom-Up LR(k) parsing?
[英]Is there a better way to write a right-recursive grammar's production rules than this?
場景:給出一個右遞歸語法的生產規則,該規則描述由字符R和N構成的所有非空字符串的集合,其中可能包含R的任意多個連續重復,但恰好包含N的兩個或三個重復。
回答:
A-> NB | R + A
B-> ND | NC | ∈
C-> ND | ∈
D-> R + D | ∈
不正確:
A -> NNB | NNNB | RA | R
B -> R | RA | ε
編輯:以上說法不正確,我誤解了情況。
正確:
S -> RS | A
A -> NA | NB
B -> RB | RC
C -> NC | ND
D -> RD | RE | ε
E -> NE | NF
F -> RF | ε
工作原理:它以S開頭,可以生成0或多個R,也可以移動到A,從而生成第一組Ns。 然后,它移動到B,在第一組和第二組Ns之間生成Rs。 然后它將移至C,生成第二組Ns。 然后,它移動到D,可以生成0個或多個Rs,然后結束或移動到E,它生成Ns的第三組。 最后,它移到F,產生0或多個Rs。
這同樣有效,也更簡單:
S -> RS | A
A -> NA | NB
B -> RB | RC
C -> NC | ND
D -> RD | E
E -> NE | F
F -> RF | ε
直到D為止都是一樣的,不是提供ε選項,而是提供添加另一組R或轉到E即另一組N的選項,但是如果以前沒有R,則不會發生這種情況。已作為C的轉換輸出,然后提供了另一個選擇以遞歸方式添加R或空字符串。
從輸入NRNR生成的示例解析樹
S
\
A
/ \
N B
/ \
R C
/ \
N D
/ \
R D
\
E
\
F
\
ε
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.