xtext
在这篇文章中,我们将看到如何开发一种简单的语言。 我们的目标是:
- 语言的解析器
- IntelliJ的编辑器 。 编辑器应具有语法突出显示,验证和自动完成功能
我们还将免费提供Eclipse和Web编辑器的编辑器 ,但请包含您的兴奋之处,本文中不再赘述。
去年,我专注于学习新知识(主要是Web和ops知识),但我仍然最喜欢的一件事就是开发DSL(领域特定语言)。 我使用的第一个相关技术是Xtext :Xtext是一种出色的工具,可让您定义语言的语法并生成该语言的出色编辑器。 到目前为止,仅针对Eclipse平台进行了开发:这意味着可以使用Eclipse开发新语言,然后可以在Eclipse中安装生成的编辑器。
最近,我使用的Eclipse少了很多,所以直到现在,我对Xtext的兴趣逐渐消失,直到最后,新版本的Xtext(仍处于beta版)瞄准了IntelliJ。 因此,当我们使用Eclipse开发语言时,我们将生成插件以在IntelliJ中使用我们的语言。
我们将要看到的技术可以用于开发任何种类的语言,但是我们将把它们应用于特定的情况:AST转换。 这篇文章是为Xtext新手准备的,我现在不做任何详细介绍,我只是分享对IntelliJ目标的第一印象。 考虑到该功能目前是测试版,因此我们可以预期会有一些粗糙的边缘。
我们正在尝试解决的问题:调整ANTLR解析器以获取出色的AST
我喜欢玩解析器,而ANTLR是出色的解析器生成器。 对于像Java这样的功能强大的语言,有很多漂亮的语法。 现在,问题是Java之类的语言的语法非常复杂,并且生成的解析器会生成不易于使用的AST。 主要问题是由于如何处理优先级规则。 考虑一下Terence Parr和Sam Harwell编写的Java 8语法 。 让我们看看如何定义一些表达式:
conditionalExpression
: conditionalOrExpression
| conditionalOrExpression '?' expression ':' conditionalExpression
;
conditionalOrExpression
: conditionalAndExpression
| conditionalOrExpression '||' conditionalAndExpression
;
conditionalAndExpression
: inclusiveOrExpression
| conditionalAndExpression '&&' inclusiveOrExpression
;
inclusiveOrExpression
: exclusiveOrExpression
| inclusiveOrExpression '|' exclusiveOrExpression
;
exclusiveOrExpression
: andExpression
| exclusiveOrExpression '^' andExpression
;
andExpression
: equalityExpression
| andExpression '&' equalityExpression
;
equalityExpression
: relationalExpression
| equalityExpression '==' relationalExpression
| equalityExpression '!=' relationalExpression
;
relationalExpression
: shiftExpression
| relationalExpression '<' shiftExpression
| relationalExpression '>' shiftExpression
| relationalExpression '<=' shiftExpression
| relationalExpression '>=' shiftExpression
| relationalExpression 'instanceof' referenceType
;
shiftExpression
: additiveExpression
| shiftExpression '<' '<' additiveExpression
| shiftExpression '>' '>' additiveExpression
| shiftExpression '>' '>' '>' additiveExpression
;
additiveExpression
: multiplicativeExpression
| additiveExpression '+' multiplicativeExpression
| additiveExpression '-' multiplicativeExpression
;
multiplicativeExpression
: unaryExpression
| multiplicativeExpression '*' unaryExpression
|