簡體   English   中英

刪除左遞歸

[英]Removing left recursion

我感覺非常懷舊所以我決定寫一個冒險游戲創建者,允許用戶輸入復雜的句子。

我手動滾動了一個使用訪問者模式的詞法分析器和解析器,它運行得很好,直到我遇到了一個左遞歸問題,我的BNF(Backus-Naur Form)規則之一:

object          ::= {adjective} noun 
                  | object AND {adjective} noun 

按照此wiki條目刪除左遞歸后這看起來是否合適?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM