對於一個任務,我們必須實現像一個非常基本的SEXP解析器,這樣對於輸入,如:很簡單SEXP解析器
"((a b) ((c d) e) f)"
這將返回:
[["a", "b"], [["c", "d"], "e"], "f"]
由於這是作爲較大賦值的一部分,解析器僅被賦予有效輸入(匹配parens & c)。我想出了Ruby中的以下解決方案:
def parse s, start, stop
tokens = s.scan(/#{Regexp.escape(start)}|#{Regexp.escape(stop)}|\w+/)
stack = [[]]
tokens.each do |tok|
case tok
when start
stack << []
when stop
stack[-2] << stack.pop
else
stack[-1] << tok
end
end
return stack[-1][-1]
end
這可能不是最好的解決方案,但它可以完成這項工作。
現在,我對核心功能的慣用Haskell解決方案感興趣(即,我不在乎分隔符的選擇或鬆散,如果可能的話只使用「核心」 haskell,沒有擴展名或像parsec這樣的庫。
請注意,這不是任務的一部分,我只是對Haskell做事感興趣。
慣用的解決方案是使用解析器庫(combinator或其他)。既然你明確排除了這個選項,一個慣用的解決方案是不可能的。編程是關於重用,而不是重新創建。 – jrockway 2010-06-29 04:41:37
當然,如果這是一個現實世界的問題,那麼你是絕對正確的。但是考慮到所有教授haskell的書籍,爲了學習的目的,Prelude功能正在被重新實現。你會不同意有一些解決方案比其他地方更習慣?是的,編程是關於重用,但學習有時可能會重塑。 – danlei 2010-06-29 10:18:07