1

因为 Scala Parsers 库要求您对 Parsers 进行子类化,这最终为您留下了特定的 Parser 实现,所以您似乎无法真正将其分离为多个类或对象,除非它们在类的范围内最初是解析器的子类。处理这个问题的正确方法是什么,这样我就不必连续有 50 个惰性 val?

4

2 回答 2

2

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

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

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

于 2012-09-03T04:35:59.897 回答
1

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

于 2012-09-03T03:57:35.573 回答