[英]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.