首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自引用PetitParser的PPCompositeParsers

自引用PetitParser的PPCompositeParsers
EN

Stack Overflow用户
提问于 2013-03-14 00:05:36
回答 1查看 99关注 0票数 4

我有一个编程语言语法,我想在PPCompositeParser的几个子类中展开(例如,一个类将处理指令,另一个类将处理表达式,另一个类将处理程序结构)。我想这样做是为了避免得到一个包含数十个实例变量的大类。

我的问题是,这些子语法具有循环依赖关系:结构语法引用语句语法的“statement”规则,语句语法引用表达式语法的“expression”规则,表达式语法引用结构语法的“subroutineName”(关闭依赖关系循环)。我尝试了一种简单的方法,例如,在表达式语法中使用#subroutineName方法,如下所示:

代码语言:javascript
复制
MyExpressionGrammar>>subroutineName
  ^ N2TJStructureParser newStartingAt: #subroutineName

但这在初始化时会失败,因为存在无限递归(显然)。

为了解决这个问题,我创建了一个PPDeferedParser:

代码语言:javascript
复制
PPParser subclass: #PPDeferedParser
    instanceVariableNames: 'creationBlock'
    classVariableNames: ''
    poolDictionaries: ''
    category: 'PetitParser-Tools'

PPDeferedParser>>parseOn: aStream
    ^ creationBlock value parseOn: aStream

这使得前面的#subroutineName看起来像这样:

代码语言:javascript
复制
MyExpressionGrammar>>subroutineName
  ^ PPDederedParser creationBlock: [N2TJStructureParser newStartingAt: #subroutineName]

这似乎是可行的,但我想知道是否有其他解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-17 07:56:16

目前,PetitParser不直接支持将一个复合解析器拆分成多个PPCompositeParser子类。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15390459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档