构建Scala解析器组合器代码的正确方法是什么?

时间:2012-09-03 03:11:36

标签: parsing scala coding-style formatting

因为Scala Parsers库要求你继承Parsers子类,最后让你有一个特定的Parser实现,看起来你不能真正将它分成多个类或对象,除非它们在最初将Parsers子类化的类。处理这个问题的正确方法是什么,这样我就不必连续有50个懒惰的值?

2 个答案:

答案 0 :(得分:2)

就个人而言,我认为这样做的方法是将所有内容保存在一个类中,或者,如果有意义的话,创建单个继承层次结构以扩展概念,就像JavaTokenParsers扩展RegexParsers一样。 Parsers。此外,通过将词法与语法分开,使用标记化解析器会有所帮助。

除此之外,将它保存在一个地方:分割语法是一种理解的噩梦。所有其余的 - AST类,以及对它们进行操作的代码,不需要与解析器保持一致。

现在,如果真的不是你的测试,你可以将它们分成特征,并使用自我类型在特征之间创建必要的依赖关系。你只需要创建一个继承了所有特征的大类(或对象)。

答案 1 :(得分:1)

您可以将不同的组件拆分为trait s,扩展相同的父Parser类型,然后将它们混合在一起以创建最终的解析器。显然,一些解析器组合器将依赖于其他解析器,但至少基本解析器(例如终端解析器)可以通过这种方式进行分解。您可能不希望将其拆分为太多不同的类/特征,否则如果代码被分割为太多不同的文件,则很难分析解析器正在做什么。