【发布时间】:2013-03-13 16:05:35
【问题描述】:
我有一个编程语言语法我想在 PPCompositeParser 的几个子类中展开(例如,一个类处理指令,另一个类处理表达式,另一个类处理程序结构)。我想这样做是为了避免得到一个包含数十个实例变量的大类。
我的问题是这些子文法有循环依赖:结构文法引用了语句文法的'statement'规则,它引用了表达式文法的'expression'规则,又引用了结构语法(关闭依赖循环)。我尝试了简单的方法,例如,在表达式语法中使用 #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]
这似乎可行,但我想知道是否有其他解决方案。
【问题讨论】:
标签: smalltalk pharo petitparser