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()];

好。 现在,假设我想将所有终端作为属性添加,并将所有非终端作为子节点添加到XML节点产生的Single_inputContext中。

让我们看一下类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);}
}

在这种情况下,我想:

  • 使用NEWLINE作为属性
  • simple_stmtcompound_stmt用作子项

我应该得到这样的东西:

<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 语言 库

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

  1. 关于ANTLR的通用库的需求:使用反射来构建元模型

    我是一名语言工程师:我使用多种工具来定义和处理语言. 在其他工具中,我使用ANTLR:它简单,灵活,可以围绕它进行构建. 但是,我发现自己围绕ANTLR为不同的项目重建了类似的工具. 我看到两个问题: ...

  2. 易语言 python库_精易Python支持库 (1.1#1205版)发布啦!

    精易Python支持库 (1.1#1205版) 本支持库提供了 6 种库定义数据类型,提供了 87 种命令. 支持库说明 该支持库为易语言调用并执行Python代码.文件提供了支持. 使用本支持库,可 ...

  3. python gis库_使用开放的python库自动化GIS和遥感工作流

    python gis库 Over my career I've worked on many geospatial related projects using the ArcGIS platform ...

  4. bazel 链接第三方动态库_如何自己制作静态库?

    前言 在<一文带你了解静态库和动态库>一文中介绍了静态库的特点以及与动态库的区别.那么你有没有想过如何把自己写好的函数接口制作成静态库给别人用呢?本文教你如何制作属于自己的静态库. 编译成 ...

  5. python链表库_[转]为什么python标准库没有实现链表

    实际上刚开始学习一些高级语言的时候我也有同样的疑问,而且即使有链表对应物的语言,链表常常也很少被实际使用. 如果是在国外听数据结构的课,老师一般会警告你这只是一个理论概念,实际应用应该实际考察,在通常 ...

  6. mysql分库一个库和多个库_数据库分库后不同库之间的关联

    数据库分库后不同库之间的关联 一.所有库在同一节点上 当业务垂直拆分出很多业务库的时候,如果都部署在同一个源上(同一个机器节点上),那么这种情况是最好办的,直接库名+表名 join就可以. 二.不在一 ...

  7. 什么是python的库_什么是python标准库

    什么是python标准库 发布时间:2020-08-24 10:49:34 来源:亿速云 阅读:72 作者:Leah 什么是python标准库?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小 ...

  8. python语言的第三方库_常用的Python第三方库

    今天公司停电,没上班.跑上来更新个博客,跟大家分享一下我常用的几个第三方 Python 库.Python 语言之所以能够如此流行,除了本身内置许多程序库来保障快速开发之外,目不睱接的第三方库也是一大主 ...

  9. 苹果设计组件库_建立设计系统和组件库

    苹果设计组件库 This post is based on the series of posts: Modernizing a jQuery frontend with React. If you ...

最新文章

  1. Javascript 对 CSS3 animation 动画的流程的简单控制
  2. 没有form的表单验证_PHP动态生成表单,内置17种常用组件并且支持表单验证!
  3. 存储过程提示data truncation_手机DATA重新分区教程(超详细)
  4. Bootloader传参数到Kernel
  5. 《Adobe After Effects CS4经典教程》——1.9 定制工作区
  6. 字符串的迷之算法——KMP,AC自动机,后缀数组
  7. android9 三星 港版,三星S9+官方港版安卓9完整固件系统升级包:TGY-G9650ZHU5CSFB
  8. 如何轻松搞定内网摄像头远程运维?EasyNTS上云网关简单三步实现设备公网远程控制、远程配置
  9. python拨号_Python进行ADSL拨号
  10. 传音手机增长策略:用户需求为核心,创新生产逻辑和客户关系
  11. 蜜瓜文案:水果蜜瓜文案短句,水果店蜜瓜发朋友圈文案
  12. 大数据中为什么使用Scala?
  13. android模拟点击系统打开apk按钮,Android开发系列: 电脑端Android模拟器安装使用教程...
  14. 大四会计转码 初学c语言的心路历程
  15. SSD算法理解(1)
  16. How to choose optimizer ?训练时,如何选择优化器?
  17. css为何不支持父元素选择器
  18. 高斯分布的积分期望E(X)方差V(X)的理论推导
  19. 我国主要青少年编程竞赛简介
  20. php将数组递归,php递归数据到数组

热门文章

  1. P5355-[Ynoi2017]由乃的玉米田【莫队,bitset,根号分治】
  2. codeforces1451 D. Circle Game
  3. 【二分】【暴力】蛋糕(gmoj 3918)
  4. ISBN号码【模拟】
  5. CF1137F Matches Are Not a Child‘s Play(树上数据结构问题、树链剖分+ODT)
  6. codeforces 877F F. Ann and Books hash+莫队算法
  7. Spring BeanFactory 容器
  8. Hibernate之映射
  9. 班级日常分享,一天一瞬间
  10. java实现人脸识别源码【含测试效果图】——Service层(IUserService)