作为一项任务,我们需要实现类似于非常基本的Sexp解析器,以便处理以下输入:
"((a b) ((c d) e) f)"
它将返回:
[["a", "b"], [["c", "d"], "e"], "f"]
由于这是一个更大任务的一部分,解析器只提供有效输入(匹配括号等)。我用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处理事情的方式感兴趣。