ANTLR和Jetbrains MPS:解析文件并以树符号显示AST

Itemis再次这样做:他们刚刚为Jetbrains MPS发布了一个非常酷的新插件。 这允许定义新的树编辑器。

他们看起来像这样:

AST

在这篇文章中,我们将看到:

  • 如何在MPS中使用ANTLR解析器
  • 如何使用树符号表示已解析的AST

特别是,我们将使用解析ANTLR语法的ANTLR语法。 那是元吗? 当然,每个ANTLR语法都可以使用相同的方法。

GitHub上始终提供代码 。

依存关系

首先,您需要安装Jetbrains MPS。 在这里获取免费副本。

要使用树符号,您应该安装mbeddr平台。 只需转到此处 ,下载zip并将其解压缩到MPS安装的插件中​​即可。

全部设置好了,该做些编程了。

包装ANTLR以在MPS内部使用

在上一篇文章中,我们讨论了如何使用Gradle在Java项目中使用现有的ANTLR语法。 我们还将在此处应用该技术。

我们首先从此处下载语法: https : //github.com/antlr/grammars-v4/tree/master/antlr4

通过将LexBasic直接包含到ANTLRv4Lexer中,我们进行了一些小的更改。 注意,我们还需要LexerAdaptor 。

为了简化用法,我们创建了一个Facade:

package me.tomasetti.mpsantlr.parser;import me.tomassetti.antlr4.parser.ANTLRv4Lexer;
import me.tomassetti.antlr4.parser.ANTLRv4Parser;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.TokenStream;import java.io.*;
import java.nio.charset.StandardCharsets;public class Antlr4ParserFacade {public ANTLRv4Parser.GrammarSpecContext parseString(String code) {InputStream inputStream = new ByteArrayInputStream(code.getBytes(StandardCharsets.UTF_8));return parseStream(inputStream);}public ANTLRv4Parser.GrammarSpecContext parseFile(File file) throws FileNotFoundException {return parseStream(new FileInputStream(file));}public ANTLRv4Parser.GrammarSpecContext parseStream(InputStream inputStream) {try {ANTLRv4Lexer lexer = new ANTLRv4Lexer(new org.antlr.v4.runtime.ANTLRInputStream(inputStream));TokenStream tokens = new CommonTokenStream(lexer);ANTLRv4Parser parser = new ANTLRv4Parser(tokens);return parser.grammarSpec();} catch (IOException e) {throw new RuntimeException("That is unexpected", e);}}}

现在我们需要一个构建文件:

buildscript {repositories {maven {name 'JFrog OSS snapshot repo'url  'https://oss.jfrog.org/oss-snapshot-local/'}jcenter()}}repositories {mavenCentral()jcenter()
}apply plugin: 'java'
apply plugin: 'antlr'
apply plugin: 'idea'dependencies {antlr "org.antlr:antlr4:4.5.1"compile "org.antlr:antlr4-runtime:4.5.1"testCompile 'junit:junit:4.12'
}generateGrammarSource {maxHeapSize = "64m"arguments += ['-package', 'me.tomassetti.antlr4.parser']outputDirectory = new File("${project.buildDir}/generated-src/antlr/main/me/tomassetti/antlr4/parser".toString())
}task fatJar(type: Jar) {manifest {attributes 'Implementation-Title': 'Antlr4-Parser','Implementation-Version': '0.0.1'}baseName = project.name + '-all'from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }with jar
}

您可能要运行:

  • gradle这个主意 ,以创建一个Jetbrains的IDEA项目
  • gradle fatJar创建一个Jar,其中将包含我们的编译代码和所有依赖项

好。 现在要将这个解析器用于MPS,我们首先创建一个项目。 在向导中,我们还选择运行时和沙箱选项。 完成后,我们应该将胖子复制到运行时解决方案的models目录下。 在我的情况下,我从Java项目的目录运行以下命令:

cp build/libs/parser-all.jar ../languages/me.tomassetti.mpsantlr/runtime/models/

窗口1
然后我们也将其添加到库中:

window2

现在,JAR的内容应出现在运行时解决方案的存根中。

存根

从AST节点创建MPS节点

现在,我们将建立一个名为AntlrImporter的新概念。 我们将使用它来选择并将ANTLR语法导入MPS:

进口商

概念结构将非常简单:

蚂蚁进口

我们还需要要导入的AST节点的概念。 首先,我们将定义抽象概念AstNode 。 然后,我们将为终端和非终端AST节点定义两个子概念。

terminal_node non_terminal_node

现在,让我们看一下AntlrImporter的编辑器。

antlrimporter_editor

第一个swing组件是一个按钮,用于打开文件选择器。 这样,我们可以轻松地选择一个文件并设置属性path 。 或者,如果愿意,我们可以手动编辑它。

file_chooser

选择文件后,我们可以通过单击第二个按钮将其导入

纽扣

导入逻辑在importModel中 ,这是AntlrImporter行为的一种方法。

import_logic

好。 这就对了。 这样我们就可以解析任何ANTLR语法并将其放入MPS。 现在我们只需要使用一个很好的表示。 我们要使用树符号。

使用树符号

树符号令人惊讶地易于使用。

首先,将com.mbeddr.mpsutil.treenotation.styles.editor添加到我们语言的编辑器方面的依赖项中。

editor_deps

我们还需要com.mbeddr.mpsutil.treenotation成为使用的语言。

editor_langs

Non TerminalNode的编辑器由单个树单元组成。 树单元的顶部代表此节点。 我们将使用ruleName表示它。 相反,我们应该在底部选择包含要在树中显示的子项的关系

non_terminal_editor

我们可以将光标放在顶部和底部之间的树形图上(“ / | \”符号),然后打开检查器。 在那里,我们可以使用样式属性来自定义树的外观

non_terminal_inspector

我们只是决定从左到右而不是从上到下显示树。 然后,当孩子过多时,我们决定在父母与孩子之间添加更多空间。 这样,线条就不会重叠太多。

这是没有财产的样子

挤

属性集的外观如下

不拥挤

例如,还有其他属性可用于控制线条的颜色和粗细。 或者,您可以在线条的末端添加形状。 现在我们不需要这些功能,但是很高兴知道它们在那里。

TerminalNode的编辑器非常简单

terminal_editor

结论

多年来,MPS变得更加稳定且易于使用。 它已达到您可以非常有效地使用它的地步。 投影编辑是一个已经存在了一段时间的想法,并且还有其他可用的实现方式,例如整个平台 。 但是,MPS的成熟度很高。

我认为我们仍然想念的是:

  • 流程和最佳实践:我们应该如何管理与其他MPS项目的依赖关系? 我们应该如何与Java库集成?
  • 示例:令人惊讶的是,几乎没有公开的应用程序。 毕竟,许多用户针对其特定用途开发DSL,并且不打算共享它们。 但是,这意味着我们几乎没有机会互相学习
  • 扩展:Mbeddr团队作为Mbeddr平台的一部分,提供了很多好东西,做得很棒。 但是,它们似乎是唯一生产可复用组件并共享它们的组件

我认为现在是时候共同了解使用投影编辑可以实现的目标了。 我认为这将是非常有趣的时期。

如果我要表达的一个愿望是,我想听到更多有关其他人如何使用MPS的信息。 如果您在那里,请敲门。 并发表评论

翻译自: https://www.javacodegeeks.com/2016/05/antlr-jetbrains-mps-parsing-files-display-ast-usign-tree-notation.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KMP字符串模式匹配详解

刚看到位兄弟也贴了份KMP算法说明,但本人觉得说的不是很详细,当初我在看这个算法的时候也看的头晕昏昏的,我贴的这份也是网上找的。且听详细分解:KMP字符串模式匹配详解 来自CSDN A_B_C_ABC 网友 KMP字符串模式匹配通俗点说…

ASP.NET Core IdentityServer4 新手上路

OAuth2.0资料 今天看到一篇博主写了该系列文章,贴图和过程都比较详细,俗话说实践是检验真理的唯一标准(如果是按照参考文章复制粘贴,应该不会出现踩坑,但是我喜欢自己手动敲一遍),发现几个坑,因而总结下经验&#xff0…

主成分分析和因子分析区别与联系

主成分分析可以简单的总结成一句话:数据的压缩和解释。常被用来寻找判断某种事物或现象的综合指标,并且给综合指标所包含的信息以适当的解释。在实际的应用过程中,主成分分析常被用作达到目的的中间手段,而非完全的一种分析方法。…

luogu P1519 穿越栅栏 Overfencing

题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷…

css实现简单的告警提示动画效果

需求&#xff1a;css实现简单的告警提示动画效果&#xff0c;当接收到实时信息的时候&#xff0c;页面弹出告警信息的动画效果<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>css实现告警提示动画</…

程序员的八个级别

2009年4月6日 陈皓 在面试时&#xff0c;你可能会被经常问到“在未来5年&#xff0c;你想干什么&#xff1f;”&#xff0c;这可能是一个比较难回答的问题。在中国&#xff0c;答案一般可能会是Team leader&#xff0c;Manager&#xff0c;或是Architect&#xff0c;Specialist…

一个具有Spring Boot,Spring Security和Stormpath的简单Web应用程序-15分钟

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 更新 &#xff1a;我们最近发布了对…

javafx2_JavaFX 2 GameTutorial第5部分

javafx2介绍 这是与JavaFX 2 Game Tutorial相关的六部分系列的第五部分。 我知道自从我写关于游戏的博客以来已经有很长时间了&#xff0c;但希望您仍然与我在一起。 如果您想回顾一下&#xff0c;请阅读第1部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分和第4 部分 &#…

史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)

转载请标明出处&#xff1a; 原文首发于&#xff1a;https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f2-ribbon/ 本文出自方志朋的博客 在上一篇文章&#xff0c;讲了服务的注册和发现。在微服务架构中&#xff0c;业务都会被拆分成一个独立的服务&#xff0c;服务与服…

忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目

Github和Sourceforge上超过600,000个Java项目中的异常处理概述 Java是使用检查异常的少数语言之一。 它们在编译时强制执行&#xff0c;并且需要某种处理。 但是……实践中会发生什么&#xff1f; 大多数开发人员实际上处理任何事情吗&#xff1f; 以及他们如何做到的&#xf…

使用Boxfuse轻松在云中运行Spring Boot应用程序

几天前&#xff0c;我开始构建一个将使用REST API检索和存储数据的iOS应用。 该REST API将是我也必须构建的服务器应用程序。 由于我熟悉Java和Spring &#xff0c;因此决定使用Spring Boot作为框架。 为了能够在我的iPhone上使用它&#xff0c;如果我可以在服务器而不是我自己…

numpy的使用数组的创建2

随机创建了长度为十的数组 获得十以类的随机整数 快速获取数组2乘3维的数组 生成20个1到10之间的数组 通过reshape 将这些数变成二位数组 shape这个方法可以查看数组中的元素是几行几列的 转载于:https://www.cnblogs.com/chenligeng/p/9315339.html

Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java

流行的Java代码样式中最有趣的亮点是什么&#xff1f; 尽管上面有暗示性的形象&#xff0c;我们也不想发动任何不必要的圣战。 当归结为编码样式时&#xff0c;大多数选择都是相当随意的&#xff0c;并取决于个人喜好。 是的&#xff0c;即使在编辑器之间制表符宽度改变了&…

ES group分组聚合的坑

参考链接&#xff1a;https://blog.csdn.net/u010454030/article/details/71762838 ES group分组聚合的坑 原来知道Elasticsearch在分组聚合时有一些坑但没有细究&#xff0c;今天又看了遍顺便做个笔记和大家分享一下。 我们都知道Elasticsearch是一个分布式的搜索引擎&#xf…

字典树 ZOJ1109 HDU1251 PKU1204 HDU1075

又称单词查找树&#xff0c;Trie树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;&#xff0c;所以经常被搜索引擎系统用于文本词频统计。它的优点是&#xff1a;…

Codeforces Round #498 (Div. 3) F. Xor-Paths

题目链接&#xff1a;F. Xor-Paths 题解&#xff1a;从起点和终点双向搜索在中间相遇时更新答案 1 #include<bits/stdc.h>2 #include<set>3 #include<cstdio>4 #include<iomanip>5 #include<iostream>6 #include<string>7 #include<cst…

创建健壮的微服务架构所涉及的组件

在本文中&#xff0c;我们将简要学习构建强大的微服务应用程序所需的各种软件组件。 在简要了解每个架构组件之前&#xff0c;我们将陈述设计微服务架构时出现的一般查询。 1.微服务架构组件 每当我们创建微服务应用程序时&#xff0c;我们都会想到以下问题 我们将如何注册微…

MATLAB画图命令zz

一、散点图 1&#xff0e;1&#xff0e;命令 plot 功能 线性二维图。在线条多于一条时&#xff0c;若用户没有指定使用颜色&#xff0c;则plot循环使用由当前坐标轴颜色顺序属性&#xff08;current axes ColorOrder property&#xff09;定义的颜色&#xff0c;以区别不同的…

jax-rs jax-ws_JAX-WS入门

jax-rs jax-wsJAX-WS代表XML Web Services的Java API。 它是一种Java编程语言API&#xff0c;用于创建Web服务和使用XML进行通信的客户端。 这篇文章是JAX-WS的快速入门。 先决条件 GlassFish与Eclipse集成在一起 。 创建JAX-WS Web服务 1.在Eclipse中创建一个名为“ com.e…

lingo解题报告内容解释

1.2菜单介绍 1.2.1 File 1 New 新建一个窗口,当你执行这个命令时,会出现如下对话框: 你可以在对话框中选择你想要建立的类型.类型如下: 1)扩展名为(*.lg4) LG4格式是LINGO4.0的版本,是在Windows下最主要的储存文件格式,这种格式支持字体格式,自定义格式以及动态连接, LG4以二进…