【发布时间】:2012-04-04 11:35:17
【问题描述】:
假设我想解析一个带有各种左括号和右括号的字符串(我在标题中使用了括号,因为我相信它更常见——不过问题是一样的),这样我就可以将所有更高级别分开一个列表。
给定:
[hello:=[notting],[hill]][3.4(4.56676|5.67787)][the[hill[is[high]]not]]
我想要:
List("[hello:=[notting],[hill]]", "[3.4(4.56676|5.67787)]", "[the[hill[is[high]]not]]")
我这样做的方法是计算左括号和右括号,并在我的计数器为 0 时添加到列表中。但是,我有一个丑陋的命令式代码。您可以假设原始字符串格式正确。
我的问题是:解决这个问题的好方法是什么?
注意:我曾考虑过使用 for...yield 构造,但考虑到计数器的使用,我无法获得简单的条件(我也必须有条件来更新计数器)而且我不知道我是如何做到的在这种情况下可以使用这种结构。
【问题讨论】:
-
类似情况:blog.tmorris.net/haskell-scala-java-7-functional-java-java。 cmets 中的代码是最有用的部分。
-
@AlexanderAzarov,每次我使用解析器组合器时,我都觉得我需要更多的经验才能熟练地在几乎一定的时间内获得解决方案。这里是不是有点矫枉过正?
-
当然,解析器组合器是非常通用的工具。当您知道如何使用它时,您将能够非常快速地提出一个可靠的解决方案并且代码更具可读性。像往常一样,这是一个权衡(“维护成本”与“性能”),因为手写算法很可能会更高效。
标签: scala functional-programming