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 - начало файла.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"
}
Другие вопросы по тегам