[英]Removing left recursion
我感覺非常懷舊所以我決定寫一個冒險游戲創建者,允許用戶輸入復雜的句子。
我手動滾動了一個使用訪問者模式的詞法分析器和解析器,它運行得很好,直到我遇到了一個左遞歸問題,我的BNF(Backus-Naur Form)規則之一:
object ::= {adjective} noun
| object AND {adjective} noun
object ::= {adjective} noun object2
object2 ::= AND {adjective noun}
| !Empty
編輯:
我按照這里給出的指南,使用C#手動滾動詞法分析器和解析器。 我沒有使用任何解析器生成器進行此練習。
另外,我從這個網站獲得了解析器的BNF規則。
在這種情況下,有沒有理由更喜歡左遞歸而不是右遞歸? 這不會更簡單:
object ::= {adjective} noun |
{adjective} noun AND object
如果你真的想讓你的解決方案工作,你需要使object2
正確遞歸:
object ::= {adjective} noun object2
object2 ::= AND {adjective noun} object2 |
!Empty
通常當我有這個規則(你的)時:
object ::= {adjective} noun |
object AND {adjective} noun
我應用以下轉換:
第1階段(仍然是遞歸) -
object ::= ad_noun |
object AND ad_noun
ad_noun ::= {adjective} noun
第2階段(更改為正確的遞歸) -
object ::= ad_noun |
ad_noun AND object
ad_noun ::= {adjective} noun
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.