我有自定义对象的操作。我不想每次生成解析器时都复制和粘贴所有#imports。这是否可能与某些@begin或其他指令一起使用。
例如:
mycustomRule: word {
PUSH([[MyCoolNewObject alloc] initWith:POP_STR()]);
};
这一切都完美生成,但是当尝试编译时,生成的文件显然缺少#import "MyCoolNewObject.h"
我有自定义对象的操作。我不想每次生成解析器时都复制和粘贴所有#imports。这是否可能与某些@begin或其他指令一起使用。
例如:
mycustomRule: word {
PUSH([[MyCoolNewObject alloc] initWith:POP_STR()]);
};
这一切都完美生成,但是当尝试编译时,生成的文件显然缺少#import "MyCoolNewObject.h"
PEGKit的创建者在这里。
PEGKit(但不是 ParseKit)有一个受 ANTLR 启发的功能,称为“Grammar Actions”。Grammar Actions 是一种完全符合您要求的方法:在 Parser 的 .h 和 .m 文件的不同位置插入任意代码。在列出任何规则之前,它们必须放在语法的顶部。
使用PEGKit 标签 v0.3.6或更高版本(或主的 HEAD)。
以下是当前可用的所有语法动作,以及它们的主体在生成的解析器的源代码中插入位置的描述:
在 .h 文件中:@h- .h 文件的顶部@interface- 在@interface标题部分内@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"
}