Создание классов Java из файла грамматики DSL

Я ищу способ создать синтаксический анализатор из файла грамматики (типа BNF / BNF), который будет заполнять AST. Однако я также стремлюсь автоматически генерировать различные классы AST в удобочитаемом для разработчиков виде.

Пример: для следующего файла грамматики

expressions = expression+;
expression = CONST | math_expression;
math_expression = add_expression | substract_expression;
add_expression = expression PLUS expression;
substract_expression = expression MINUS expression;

CONST: ('0'..'9')+;
PLUS: '+';
MINUS: '-';    

Я хотел бы создать следующие классы Java (с примером того, какими я ожидаю их полей):

class Expressions {List<Expression> expression};
class Expression {String const; MathExpression mathExpression;} //only one should be filled.
class MathExpression {AddExpression addExpression; SubstractExpression substractExpression;}
class AddExpression {Expression expression1; Expression expression2;}
class SubstractExpression {Expression expression1; Expression expression2;}

И во время выполнения я хотел бы, чтобы выражение «1 + 1-2» генерировало следующий граф объектов для представления AST:

Expressions(Expression(MathExpression(AddExpression(1, SubstractExpression(1, 2)))))

(не говоря уже о приоритете операторов).

Я изучал генераторы парсеров DSL (JavaCC / ANTLR и другие), и самое близкое, что я смог найти, - это использование ANTLR для генерации класса слушателя с методами стиля «enterExpression» и «leaveExpression». Я нашел несколько похожий код, созданный с использованием JavaCC и jjtree с использованием "multi", но он чрезвычайно неудобен и сложен в использовании.

Мои потребности в грамматике довольно просты - и я хотел бы максимально автоматизировать создание графа объектов AST.

Какие-нибудь намеки?


person Ran Biron    schedule 27.01.2013    source источник


Ответы (1)


Если вам нужна большая поддержка для построения DSL, ANTLR и JavaCC, вероятно, не подходят. Они обеспечивают синтаксический анализ, некоторую поддержку построения деревьев ... и после этого вы сами. Но, как вы уже поняли, нужно много работать, чтобы спроектировать свои собственные деревья, проработать детали, и на этом этапе вы вряд ли закончите с DSL; вы по-прежнему не можете использовать его.

Есть и более полные решения: JetBrains MPS, Xtext, Spoofax, DMS. Все они предоставляют способы определения DSL, преобразования его во внутреннюю форму («деревья построения») и обеспечивают поддержку генерации кода. Первые три имеют интегрированную поддержку IDE и предназначены для «малых» DSL; DMS этого не делает, но обрабатывает реальные языки, такие как C ++, а также DSL. Я думаю, что первые три - с открытым исходным кодом; DMS является коммерческой (я сторонник DMS).

Маркус Фельтер только что выпустил онлайн-книгу по DSL Engineering, которая может помочь вам в пожертвовании. Он очень подробно описывает MPS, XText, Spoofax, но ничего не говорит о DMS. Он говорит вам, что вам нужно знать и что вам нужно делать; судя по моему беглому обзору книги, он довольно обширен. Вы, вероятно, не собираетесь останавливаться на «простом»; DSL обладают большой семантической сложностью, а вспомогательный механизм сложен.

Я знаю автора, очень уважаю его навыки в этой сфере и вместе с ним читал лекции по техническим летним навыкам, включая хорошее пиво. Иначе мне нечего делать с этой книгой.

person Ira Baxter    schedule 28.01.2013
comment
быть пивным другом обычно лучше, чем быть коллегой :). В любом случае - я думал, что MPS не будет делать то, что я хочу - насколько я понимаю, вы создаете грамматику DSL и правила преобразования и разрабатываете в самом MPS, чтобы создать целую программу. Мне нужен переносимый синтаксический анализатор, которому я могу передать строку, и он будет выводить AST для моего семантического анализа. Затем я планирую выполнить несколько проходов по нему, чтобы понять, что мне нужно сделать, чтобы удовлетворить запрос. Я не знаком с другими (я взглянул на Xtext, но, похоже, он не предоставил то, что мне нужно). - person Ran Biron; 28.01.2013
comment
ANTLR обеспечивает базовые возможности синтаксического анализа и построения дерева; это, вероятно, ваш лучший выбор, если вы настаиваете на остановке на деревьях. Но см. Мое эссе «Жизнь после анализа» semanticdesigns.com/Products/DMS/LifeAfterParsing. html - person Ira Baxter; 28.01.2013