Генерировать классы из правил грамматики, разбирать объекты
Можно ли сгенерировать.m и.h для любой грамматики / правил, чтобы во время синтаксического анализа он создавал объект, представляющий это правило.
Итак, немного грамматики
coolObjName = Word;
может сгенерировать класс с именем coolObjName (или некоторой вариацией), имеющий поле для слова и генерирующий действие:
coolObjName = Word{
CoolObjName* newName = [[CoolObjName alloc] initWithWord:POP_STR()];
PUSH(newName);
};
Тогда правило более высокого уровня, такое как:
myhigherlevel = coolObjName Number;
создаст класс myHigherLevel, который имеет элемент coolObjName и число, а затем добавляет действие:
myhigherlevel = coolObjName Number{
double num = POP_DOUBLE();
coolObjName* name = POP();
MyHigherLevel* higherLevel = [[MyHigherLevel alloc] init];
higherLevel.number = num;
higherLevel.name = name;
PUSH(higherLevel);
};
Пустые теги превращаются в пустые объекты и *
а также +
результат в массивах.
Есть ли инструмент, который может сделать это или куда бы я пошел, чтобы создать такой. (кажется супер полезным и удивительным)
1 ответ
Создатель PEGKit здесь.
В настоящее время в PEGKit нет ничего, что могло бы проверять ваши правила и автоматически генерировать ObjC AST или классы моделей, которые могли бы соответствовать вашим намерениям. На данный момент PEGKit может генерировать только исходный код для вашего анализатора, но не ваши связанные классы AST или модели.
Вполне вероятно, что вы будете создавать абстрактное синтаксическое дерево (или промежуточное представление) в ваших действиях или в функциях обратного вызова Parser Delegate. ANLTR имеет несколько замечательных высокоуровневых функций перезаписи дерева, которые позволяют вам указать в грамматике, как построить свой AST. Хотя, глядя на документы, кажется, что это могло значительно измениться после ANTLR 3? Точно сказать не могу. Раньше это выглядело примерно так (возможно, так и есть, я не эксперт по ANTLR):
addExpr : lhs=NUM op='+' rhs=NUM -> ^(op lhs rhs);
->
значит переписать на дерево как…
И ^(op …)
означает дерево с корнем из плюсового оператора, содержащего потомков….
Я хотел бы добавить такие функции переписывания дерева в PEGKit, для явной цели построения AST (но не для других объектов модели). Но, честно говоря, это огромная задача, и вряд ли она скоро появится.