gpt4 book ai didi

smalltalk - 自引用 PetitParser 的 PPCompositeParsers

转载 作者:行者123 更新时间:2023-12-01 02:27:15 25 4
gpt4 key购买 nike

我有一个编程语言语法,我想在 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]

这似乎有效,但我想知道是否还有其他解决方案。

最佳答案

当前将复合解析器拆分为多个 PPCompositeParser PetitParser 不直接支持子类。

请记住,如果您使用 PetitParser 浏览器,则无需担心实例变量,它们会自动为您管理。此外,您不必为每个产品都需要一个实例变量。例如,终端可以在您直接调用的方法中。

你的解决方案当然也有效,但它并不是那么好,因为它需要你仔细注意你想要如何连接你的语法。同样在您的实现中,您应该延迟缓存结果,否则您的代码将在解析时创建新的复合解析器。这是非常昂贵的。

撇开所有这些不谈,当然可以改进 PPCompositeParser支持多个子类之间的依赖关系,例如通过声明构造函数将准备、初始化和最终解析的依赖的其他解析器。

关于smalltalk - 自引用 PetitParser 的 PPCompositeParsers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15390459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com