我有一个编程语言语法,我想在PPCompositeParser的几个子类中展开(例如,一个类将处理指令,另一个类将处理表达式,另一个类将处理程序结构)。我想这样做是为了避免得到一个包含数十个实例变量的大类。
我的问题是,这些子语法具有循环依赖关系:结构语法引用语句语法的“statement”规则,语句语法引用表达式语法的“expression”规则,表达式语法引用结构语法的“subroutineName”(关闭依赖关系循环)。我尝试了一种简单的方法,例如,在表达式语法中使用#subroutineName方法,如下所示:
MyExpressionGrammar>>subroutineName
^ N2TJStructureParser newStartingAt: #subroutineName但这在初始化时会失败,因为存在无限递归(显然)。
为了解决这个问题,我创建了一个PPDeferedParser:
PPParser subclass: #PPDeferedParser
instanceVariableNames: 'creationBlock'
classVariableNames: ''
poolDictionaries: ''
category: 'PetitParser-Tools'
PPDeferedParser>>parseOn: aStream
^ creationBlock value parseOn: aStream这使得前面的#subroutineName看起来像这样:
MyExpressionGrammar>>subroutineName
^ PPDederedParser creationBlock: [N2TJStructureParser newStartingAt: #subroutineName]这似乎是可行的,但我想知道是否有其他解决方案。
发布于 2013-03-17 07:56:16
目前,PetitParser不直接支持将一个复合解析器拆分成多个PPCompositeParser子类。
请记住,如果您使用PetitParser浏览器,则不需要为实例变量操心,它们会自动为您管理。此外,您不必为每个产品都需要一个实例变量。例如,终端可以在您直接调用的方法中。
你的解决方案当然也是有效的,但它不是那么好,因为它需要你仔细注意你想要如何连接你的语法。此外,在您的实现中,您应该延迟缓存结果,否则您的代码将在解析时创建新的复合解析器。这很贵的。
https://stackoverflow.com/questions/15390459
复制相似问题