簡體   English   中英

解析快樂:左遞歸與右遞歸

[英]Parsing with Happy: left-recursion versus right-recursion

Happy用戶手冊的2.2節建議你使用左遞歸而不是右遞歸,因為右遞歸是“低效的”。 基本上他們說如果你試圖解析一長串項目,右遞歸將溢出解析堆棧,而左遞歸使用常量堆棧。 給出的典型例子是

items : item            { $1 : [] }
      | items "," item  { $3 : $1 }

不幸的是,這意味着項目列表向后出現。

現在很容易在最后應用reverse (盡管令人討厭的是你必須在調用解析器的每個地方執行此操作,而不是在定義它的地方執行此操作)。 但是,如果項目列表很大,肯定reverse 也會溢出Haskell堆棧? 沒有?

基本上,我如何制作它,以便我可以解析任意大的文件,仍然以正確的順序得到結果?

如果您想要的是每次都要reverse的所有items ,您可以定義

items  : items_           {reverse $1}

items_ : item             { $1 : [] }
       | items_ "," item  { $3 : $1 }

reverse不會溢出堆棧。 如果您需要說服自己,請嘗試評估length $ reverse [1..10000000]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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