antlr 语言 库_关于ANTLR的通用库的需求:使用反射来构建元模型

antlr 语言 库

我是一名语言工程师:我使用多种工具来定义和处理语言。 在其他工具中,我使用ANTLR:它简单,灵活,可以围绕它进行构建。

但是我发现自己围绕ANTLR为不同的项目重建了类似的工具。 我看到两个问题:

  • ANTLR是一个非常好的构建基块,但是仅使用ANTLR并不能做很多事情:价值在于我们可以在AST上进行的处理,而且我看不到ANTLR周围的图书馆生态系统
  • ANTLR不会产生语法的元模型:如果没有,就很难围绕ANTLR构建通用工具

让我解释一下:

  • 对于具有EMF经验的人:对于每个语法,我们基本上都需要一个等效的Ecore。
  • 对于其他:请阅读下一段

为什么我们需要一个元模型

假设我想构建一个通用库,以根据ANTLR生成的AST生成XML文件或JSON文档。 我该怎么办?

好吧,给定一个ParseRuleContext,我可以获取规则索引并找到名称。 我为Python语法生成了解析器,并提供了一些示例,因此,让我们看一下如何使用实际的类:

Python3Parser.Single_inputContext astRoot = pythonParse(...my code...);
String ruleName = Python3Parser.ruleNames[astRoot.getRuleIndex()];

让我们看一下类Single_inputContext:

public static class Single_inputContext extends ParserRuleContext {public TerminalNode NEWLINE() { return getToken(Python3Parser.NEWLINE, 0); }public Simple_stmtContext simple_stmt() {return getRuleContext(Simple_stmtContext.class,0);}public Compound_stmtContext compound_stmt() {return getRuleContext(Compound_stmtContext.class,0);}public Single_inputContext(ParserRuleContext parent, int invokingState) {super(parent, invokingState);}@Override public int getRuleIndex() { return RULE_single_input; }@Overridepublic void enterRule(ParseTreeListener listener) {if ( listener instanceof Python3Listener ) ((Python3Listener)listener).enterSingle_input(this);}@Overridepublic void exitRule(ParseTreeListener listener) {if ( listener instanceof Python3Listener ) ((Python3Listener)listener).exitSingle_input(this);}
}

我应该得到这样的东西:

<Single_input NEWLINES="..."><Simple_stmt>...</Simple_stmt><Compund_stmt>...</Compunt_stmt>
</root>

好。 对我来说,看课并识别这些元素非常容易,但是我如何自动做到这一点呢?

反思,显然,您会思考。

是。 那行得通。 但是,如果我们有多个元素怎么办? 参加本课:

public static class File_inputContext extends ParserRuleContext {public TerminalNode EOF() { return getToken(Python3Parser.EOF, 0); }public List NEWLINE() { return getTokens(Python3Parser.NEWLINE); }public TerminalNode NEWLINE(int i) {return getToken(Python3Parser.NEWLINE, i);}public List stmt() {return getRuleContexts(StmtContext.class);}public StmtContext stmt(int i) {return getRuleContext(StmtContext.class,i);}public File_inputContext(ParserRuleContext parent, int invokingState) {super(parent, invokingState);}@Override public int getRuleIndex() { return RULE_file_input; }@Overridepublic void enterRule(ParseTreeListener listener) {if ( listener instanceof Python3Listener ) ((Python3Listener)listener).enterFile_input(this);}@Overridepublic void exitRule(ParseTreeListener listener) {if ( listener instanceof Python3Listener ) ((Python3Listener)listener).exitFile_input(this);}
}

现在,方法NEWLINEstmt返回列表。 您可能还记得,一般而言,泛型在Java中不能很好地与反射结合使用。 在这种情况下,我们很幸运,因为有一个解决方案:

Class clazz = Python3Parser.File_inputContext.class;
Method method = clazz.getMethod("stmt");
Type listType = method.getGenericReturnType();
if (listType instanceof ParameterizedType) {Type elementType = ((ParameterizedType) listType).getActualTypeArguments()[0];System.out.println("ELEMENT TYPE "+elementType);
}

这将打印:

元素类型类me.tomassetti.antlrplus.python.Python3Parser $ StmtContext

因此,我们也可以介绍泛型。 好的,使用反射并不理想,但是我们可以从中提取一些信息。

我不是100%肯定会足够,但是我们可以开始。

元模型应该如何?

为了定义元模型,我不会尝试任何幻想。 我将使用经典模式,它是EMF的基础,它与MPS中可用的模式相似。

我将添加一种名为PackageMetamodel的容器。 中将列出几个实体。 我们也可以将其中一个实体标记为实体。

每个实体将具有:

  • 一个名字
  • 可选的父实体(从其继承属性和关系)
  • 属性列表
  • 关系列表

每个属性将具有:

  • 一个名字
  • 从原始类型中选择的一种类型。 实际上,我希望只使用String和Integers。 将来可能枚举
  • 多个(1个或多个)

每个关系将具有:

  • 一个名字
  • 种类: 包含引用 。 现在,AST只知道容器 ,但是稍后我们可以实现符号解析和模型转换,在那个阶段我们将需要引用
  • 目标类型:另一个实体
  • 多个(1个或多个)

下一步

我将开始构建元模型,然后再利用该元模型构建通用工具。

通常还需要执行其他操作:

  • 转换:我通常从ANTLR获得的AST是由我如何表达语法以获得可分析的内容决定的。 有时我还必须进行一些重构以提高性能。 我想在解析后转换AST,以更接近语言的逻辑结构。
  • 取消编组:我想从AST进行测试
  • 符号解析:这绝对不是一件容易的事,因为我发现为Java构建符号求解器

是的,我知道有些人在想: 只需使用Xtext即可 。 虽然我喜欢EMF(Xtext建立在它上面),但是它的学习曲线陡峭,我看到很多人对此感到困惑。 我也不喜欢OSGi如何与非OSGi世界一起玩。 最终,Xtext带有很多依赖项。

别误会:我认为Xtext在很多情况下都是一个了不起的解决方案。 但是,有些客户更喜欢精益方法。 对于有意义的情况,我们需要一种替代方法。 我认为它可以建立在ANTLR之上,但是还有很多工作要做。

几年前,我为.NET构建了类似的东西,并将其称为NetModelingFramework 。

翻译自: https://www.javacodegeeks.com/2016/05/need-generic-library-around-antlr-using-reflection-build-metamodel.html

antlr 语言 库

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

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

相关文章

Windows 如何通过命令启动和关闭 Tomcat

首先你的系统要安装tomcat&#xff0c;至于如何安装tomcat这里就不讲解了&#xff0c;接着你打开windows的DOS命令终端&#xff08;winR打开运行窗口&#xff0c;输入cmd即可&#xff09;&#xff0c;然后通过DOS命令切换到tomcat安装目录下的bin目录&#xff0c;最后执行start…

mysql超大表处理方式是_第29问:MySQL 的复制心跳说它不想跳了

问题最近年底&#xff0c;大家的数据库经常跑批量大事务&#xff0c;会发现复制突然断开&#xff0c;报错“心跳与本地信息不兼容”&#xff1a;会是什么原因&#xff1f;实验我们先来复现一下&#xff0c;再进行分析。宽油&#xff0c;做一对主从数据库&#xff1a;我们先造一…

Java的访问控制修饰符_访问权限修饰符_访问权限修饰词

public > protected > (default) > private 1.public 修饰的&#xff0c;在任何地方都可以访问 2.protected 修饰的&#xff0c;在类内部、同一个包、子类中能访问 3.default 表示在本类中、同一个包中能访问&#xff0c;但是在代码中不可以直接写 default&#xff0…

red hat安装宝塔_只需几分钟即可安装Red Hat Container Development Kit(视频)

red hat安装宝塔自从我开始使用各种形式的OpenShift&#xff08;例如带盒的Online&#xff0c;然后又作为容器化的图像&#xff09;玩耍以来&#xff0c;没有什么比Red Hat Container Development Kit&#xff08;CDK&#xff09;的可用性令我兴奋。 该套件使您可以轻松地访问…

基于RTP的QOS算法简介

服务质量QoS&#xff08;Quality of Service&#xff09;用于评估服务方满足客户服务需求的能力。通过配置QoS&#xff0c;对企业的网络流量进行调控&#xff0c;避免并管理网络拥塞&#xff0c;减少报文的丢失率&#xff0c;同时也可以为企业用户提供专用带宽或者为不同的业务…

es修改type名称_ElasticSearch如何修改索引字段

一、需求 当es字段类型无法支撑业务需求,需要修改到字段类型的时候。例如修改字段类型从Integer变成double,这种情况下,是没办法修改es的字段的type的。 原因是一个字段的类型进行修改之后,ES会重新建立对这个字段的索引信息,ElasticsSearch的底层是Lucene库,字段类型修改…

MyEclipse for Windows 关于 java、jsp、xml、js、html 等文件的注释快捷键及注释格式介绍

文章目录java 的注释单行注释多行注释文本注释jsp 的注释第一种第二种第三种css 的注释js 的注释单行注释奇葩的单行注释多行注释文档注释xml 的注释html 的注释java 的注释 单行注释 public class HelloWorld{public static void main(String [] args){System.out.println(&…

sap 分摊分配不产生会计凭证的原因_SAP软件的物料分类账功能

物料账介绍物料分类账(Material Ledger)是SAP财务模块的重要功能之一&#xff0c;用于对标准价计价的物料进行差异处理。激活ML后&#xff0c;系统会在"工厂物料"层(或更细的层次)为每个物料建立子账簿&#xff0c;记录该物料在各个期间的数量、价值变化情况。月底运…

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

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

数据结构【队列专题】

先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;的线性序列&#xff0c;成为“队列”。 队列也是一种线性表&#xff0c;只不过它是操作受限的线性表&#xff0c;只能在两端操作&#xff1a; 一端进&#xff0c;一端出。进的一端成为队尾&#xff08;re…

软件项目的命名规范/命名规则

文章目录项目名称目录名称包命名虚拟目录资源路径Java 代码命名属性文件 properties 命名xml文件命名jsp文件命名html文件命名js文件命名css文件命名图片文件命名数据库命名html标签的属性值命名规则项目名称 使用小串式命名法 项目名称使用英文&#xff0c;全部字母小写&…

数据结构【高精度专题】

// 高精度加法 // C A B, A > 0, B > 0 vector<int> add(vector<int> &A, vector<int> &B) {if (A.size() < B.size()) return add(B, A);vector<int> C;int t 0;for (int i 0; i < A.size(); i ){t A[i];if (i < B.size…

react java_独眼巨人React组织了Java 8库的寒武纪爆发

react java什么是独眼巨人React&#xff1f; Lambda表达式和默认方法在Java 8中的到来预示了Java语言十年来最大的结构性变化。 在此基础上构建了一些新的很酷的API&#xff0c;例如Stream, Optional, CompletableFuture最终Java开发人员可以以更实用的样式进行编码。 尽管这是…

oracle安装卡在create inventory_滴滴云服务器上安装Oracle12cR2单实例数据库

一、相关说明Oracle数据库是由美国甲骨文公司推出的一款优秀的关系型数据库。当前最新版为Database 19c。本文简述Oracle Database 12cR2在滴滴云主机上的安装过程。如需更权威的指导方法请参考Oracle官方安装文档。二、环境概述一台DC2云主机&#xff08;2c4g&#xff09;一个…

MyEclipse的build、clean、publish、clean(redeploy)的区别

文章目录buildcleanpublishclean(redeploy)新增了java文件或者修改了已有的java文件删除了java文件或者包修改了classes目录以外的文件build 就是将工程src目录的内容全新输出到工程的classes目录下&#xff0c;全面覆盖旧的文件&#xff0c;需要编译的会编译后再输出 clean …

jgroups_JGroups:无需额外基础架构的领导人选举

jgroups嗨&#xff0c;您好&#xff0c; 在本文中&#xff0c;我将展示如何在不使用任何其他基础架构&#xff08;例如Apache Zookeeper或Consul&#xff09;的情况下解决领导人选举的问题。 领导者选举是解决以下问题的一种常见方法&#xff1a;在分布式系统中&#xff0c;只…

【WebRTC---序篇】(二)Windows平台WebRTC源码编译

需要准备的东西 (一)一个强大的梯子(懂得都懂)!!!!!!!!! (二) 下载depot_tools Windows指定地址必须在此下载 打开这个页面,找 install depot_tools 这个关键字 请把他解压到C盘,并且设置到PATH环境变量种,且让它处于最顶端。 其他需要设置的额外变量 DEPOT_TOOLS_…

商品管理后台发布商品时,规格值组合的前端交互的实现逻辑

方案1&#xff1a;先计算总行数&#xff0c;再循环填充规格值 根据每种规格值数量计算得到总行数&#xff0c;如果下图有3种规格&#xff1a;长度、重量、大小&#xff0c;规格值个数分别为&#xff1a;3、3、2,3x3x218行。 规格种类有3种&#xff0c;于是写3层嵌套递归循环填…

python是什么牌子主机_python 收集主机信息

这篇文章是之前几篇的一个小综合。也是通过收集主机的一些参数信息&#xff0c;熟悉python里的文件读取&#xff0c;字符切割&#xff0c;字典存储等知识。文章结构&#xff1a;(1) 文章目的&#xff0c;需要收集的信息&#xff0c;并逐个分析如何获取信息。(2) 给出实现的pyth…

antlr idea 入门_ANTLR入门:构建简单的表达语言

antlr idea 入门这是该系列的第一篇文章。 本系列的目的是描述如何创建有用的语言和所有支持工具。 在本文中&#xff0c;我们将开始研究一种非常简单的表达语言。 我们将在语言沙箱中构建它&#xff0c;因此我们将其称为语言Sandy 。 我认为工具支持对于一种语言至关重要&am…