1

我有自定义对象的操作。我不想每次生成解析器时都复制和粘贴所有#imports。这是否可能与某些@begin或其他指令一起使用。

例如:

mycustomRule: word {
    PUSH([[MyCoolNewObject alloc] initWith:POP_STR()]);
};

这一切都完美生成,但是当尝试编译时,生成的文件显然缺少#import "MyCoolNewObject.h"

4

1 回答 1

1

PEGKit的创建者在这里。

PEGKit(但不是 ParseKit)有一个受 ANTLR 启发的功能,称为“Grammar Actions”。Grammar Actions 是一种完全符合您要求的方法:在 Parser 的 .h 和 .m 文件的不同位置插入任意代码。在列出任何规则之前,它们必须放在语法的顶部。

使用PEGKit 标签 v0.3.6或更高版本(或主的 HEAD)。

以下是当前可用的所有语法动作,以及它们的主体在生成的解析器的源代码中插入位置的描述:

在 .h 文件中:
  • @h- .h 文件的顶部
  • @interface- 在@interface标题部分内
在 .m 文件中:
  • @m- .m 文件的顶部
  • @extension@interface MyParser ()-在 .m 文件的私有类扩展中
  • @ivars@implementation MyParser {}- .m 文件中的私有 ivars
  • @implementation- 在你的解析器里面@implementation。定义方法的地方。
  • @init- 在你的解析器init方法中
  • @deallocdealloc-如果 ARC 未启用,则在解析器的方法中
  • @before- 设置代码在这里。在解析开始之前执行。
  • @after- 拆解代码在这里。解析结束后执行。

(请注意,此处列出的@before和语法操作与 和 不同,后者也可以放置在每个单独的规则中。)@after@before@after

对于您当前的需求,@m语法操作是正确的选择。因此,将其添加到语法的顶部:

@m {
#import "MyCoolNewObject.h"
}
于 2014-03-31T13:32:58.887 回答