因为Scala Parsers库要求你继承Parsers子类,最后让你有一个特定的Parser实现,看起来你不能真正将它分成多个类或对象,除非它们在最初将Parsers子类化的类。处理这个问题的正确方法是什么,这样我就不必连续有50个懒惰的值?
答案 0 :(得分:2)
就个人而言,我认为这样做的方法是将所有内容保存在一个类中,或者,如果有意义的话,创建单个继承层次结构以扩展概念,就像JavaTokenParsers
扩展RegexParsers
一样。 Parsers
。此外,通过将词法与语法分开,使用标记化解析器会有所帮助。
除此之外,将它保存在一个地方:分割语法是一种理解的噩梦。所有其余的 - AST类,以及对它们进行操作的代码,不需要与解析器保持一致。
现在,如果真的不是你的测试,你可以将它们分成特征,并使用自我类型在特征之间创建必要的依赖关系。你只需要创建一个继承了所有特征的大类(或对象)。
答案 1 :(得分:1)
您可以将不同的组件拆分为trait
s,扩展相同的父Parser
类型,然后将它们混合在一起以创建最终的解析器。显然,一些解析器组合器将依赖于其他解析器,但至少基本解析器(例如终端解析器)可以通过这种方式进行分解。您可能不希望将其拆分为太多不同的类/特征,否则如果代码被分割为太多不同的文件,则很难分析解析器正在做什么。