PegKit custom включает файлы для пользовательских действий
У меня есть действия с пользовательскими объектами. Мне бы не хотелось копировать и вставлять все #imports каждый раз, когда я генерирую парсер. Это возможно с некоторыми @begin
или какая-то другая директива.
например:
mycustomRule: word {
PUSH([[MyCoolNewObject alloc] initWith:POP_STR()]);
};
Все это генерируется идеально, но затем при попытке компиляции очевидно, что сгенерированный файл отсутствует #import "MyCoolNewObject.h"
1 ответ
Создатель PEGKit здесь.
PEGKit (но не ParseKit) имеет функцию, вдохновленную ANTLR, под названием "Грамматические действия". Грамматические действия - это способ сделать именно то, что вы ищете: вставлять произвольный код в различные места в файлах.h и.m вашего анализатора. Они должны быть помещены в верхней части вашей грамматики, прежде чем какие-либо правила перечислены.
Используйте тег PEGKit v0.3.6 или новее (или HEAD of master).
Вот все доступные на данный момент действия по грамматике, а также описание того, где их тела вставлены в исходный код вашего сгенерированного парсера:
В файле.h:@h
- начало файла.h@interface
- внутри@interface
часть заголовка
@m
- начало файла.m@extension
- внутри частного@interface MyParser ()
расширение класса в файле.m@ivars
- частные ивы внутри@implementation MyParser {}
в.m файле@implementation
- внутри вашего парсера@implementation
, Место для определения методов.@init
- внутри вашего парсераinit
метод@dealloc
- внутри вашего парсераdealloc
метод, если ARC не включен@before
код установки идет здесь. выполняется до начала разбора.@after
Снос кода идет здесь. выполняется после разбора заканчивается.
(обратите внимание, что @before
а также @after
Грамматические действия, перечисленные здесь, отличаются от @before
а также @after
который также может быть размещен в каждом отдельном правиле.)
Для ваших текущих потребностей, @m
Грамматическое действие - правильный выбор. Так что добавьте это в начало вашей грамматики:
@m {
#import "MyCoolNewObject.h"
}