[英]How to convert this grammar to LL(1)?
S→Y | 1倍
X→1X | 0
Y→Y 0 | 1X1 | 2X2
當同一符號不止一個時,我不明白如何進行分解或替換。 感謝您。
X → 1 X | 0
指的是0或更多的1
后跟0
,所以它等效於
X → 1* 0
可以使用相同的方法刪除您的左遞歸。 你可以重寫
S → Y | 1 X
X → 1 X | 0
Y → Y 0 | 1 X 1 | 2 X 2
如
S → Y | 1 X
X → 1* 0
Y → ( 1 X 1 | 2 X 2 )* 0
在EBNF中:
S → Y | 1 X
X → 1* 0
Y → A* 0
A → 1 X 1 | 2 X 2
在BNF中:
S → Y | 1 X
X → 1* 0
Y → A* 0
A → 1 X 1 | 2 X 2
1* → 1 1* | Ɛ
A* → A A* | Ɛ
如果您要做的就是消除左遞歸,那么您就完成了。
如果您也想消除公共前綴,則不會做完,因為S
兩個子規則都可以以1 X
開頭。 要解決此問題,請內聯並分發以獲得以下內容:
S → 0
| 1 X 1 Y
| 2 X 2 Y
| 1 X
X → 1* 0
Y → A* 0
A → 1 X 1 | 2 X 2
現在,我們終於可以排除常見的1 X
。
S → 0
| 1 X ( 1 Y )?
| 2 X 2 Y
X → 1* 0
Y → A* 0
A → 1 X 1 | 2 X 2
在EBNF中:
S → 0 | 1 X B? | 2 X 2 Y
X → 1* 0
Y → A* 0
A → 1 X 1 | 2 X 2
B → 1 Y
在BNF中:
S → 0 | 1 X B? | 2 X 2 Y
X → 1* 0
Y → A* 0
A → 1 X 1 | 2 X 2
B → 1 Y
B? → B | Ɛ
1* → 1 1* | Ɛ
A* → A A* | Ɛ
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.