从DSL语法文件生成java类

时间:2013-01-27 20:21:27

标签: antlr dsl parser-generator bnf compiler-compiler

我正在寻找一种从语法文件(类似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;}

而且,在运行时,我想要表达式&#34; 1 + 1-2&#34;生成以下对象图来表示AST:

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

(不要介意运算符优先级)。

我一直在探索DSL解析器生成器(JavaCC / ANTLR和朋友),我能找到的最接近的东西是使用ANTLR生成一个监听器类,其中包含&#34; enterExpression&#34;和&#34; leaveExpression&#34;风格方法。我发现使用JavaCC和jjtree使用&#34; multi&#34;生成了一些类似的代码。 - 但它非常难以使用。

我的语法需求有点简单 - 我想尽可能自动化AST对象图的创建。

任何提示?

1 个答案:

答案 0 :(得分:2)

如果你想要对DSL构建提供大量支持,那么ANTLR和JavaCC可能就不可能了。它们提供解析,建立树木的一些支持......之后你就可以独立完成了。但是,正如你已经想到的那样,设计自己的树木需要做很多工作,弄清楚细节,那时你很难完成DSL;你仍然不能使用它。

还有更完整的解决方案:JetBrains MPS,Xtext,Spoofax,DMS。所有这些都提供了定义DSL的方法,将其转换为内部形式(“构建树”),并为代码生成提供支持。前三个集成了IDE支持,适用于“小型”DSL; DMS没有,但处理真正的语言,如C ++和DSL。我认为前三个是开源的; DMS是商业化的(我是DMS背后的一方)。

Markus Voelter刚刚发布了一本关于DSL Engineering的在线图书,可用于您的捐赠。他详细介绍了MPS,XText,Spoofax,但在DMS上没有。他告诉你你需要知道什么以及你需要做什么;根据我对这本书的浏览,它非常广泛。你可能不会因为“简单”而离开; DSL具有很多语义复杂性,支持机制很难。

我知道作者,他非常尊重他在这个领域的技能,并与他共同讲授技术夏季技巧,包括喝一些不错的啤酒。否则我没事做这本书。