Я ищу способ создать синтаксический анализатор из файла грамматики (типа 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.
Какие-нибудь намеки?