我正在寻找一种从将填充 AST 的语法文件(类似 BNF/BNF)生成解析器的方法。但是,我还希望以开发人员可读的方式自动生成各种 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”样式方法的侦听器类。我发现使用“multi”使用 JavaCC 和 jjtree 生成的代码有点相似——但它非常笨拙且难以使用。
我的语法需求有点简单——我想尽可能地自动化 AST 对象图的创建。
有什么提示吗?