我有一个编程语言语法我想在 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]
这似乎可行,但我想知道是否还有其他解决方案。