我有自定义对象的操作。我不想每次生成解析器时都复制和粘贴所有#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
方法中@dealloc
dealloc
-如果 ARC 未启用,则在解析器的方法中@before
- 设置代码在这里。在解析开始之前执行。@after
- 拆解代码在这里。解析结束后执行。(请注意,此处列出的@before
和语法操作与 和 不同,后者也可以放置在每个单独的规则中。)@after
@before
@after
对于您当前的需求,@m
语法操作是正确的选择。因此,将其添加到语法的顶部:
@m {
#import "MyCoolNewObject.h"
}