首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

浅尝antlr4

几个需要了解AST:抽象语法树 target language:antlr可以根据源语言.g4文件生成不同语言(target language)分析代码 各种target language...文档(有些很简略) Lexer:antlr词法分析器(词法分析) Parser:antlr语法分析器(语法分析) Listener:是antlr独有概念,与传统源码分析不同,antlr提供...python分析模块 获取.g4语法文件 ANTLRGitHub项目中提供了用于不同语言语法文件(.g4) 官方g4文件收录库 这次需求先重点解决java语法分析问题,所以一开始我找到了java9...调用antlr语法分析模块,生成AST,供自定义Listener使用: from antlr4 import FileStream, CommonTokenStream, ParseTreeWalker...,因此任何上下文类都可以访问语法解析所需基本信息(通过getChild,getParent等方法) 还有很多细节信息其实都有,这里就不一一赘述(都在源码里啦) 测试 到这里分析模块就完成啦,用官方提供

1.6K21
您找到你想要的搜索结果了吗?
是的
没有找到

Chapi —— 一个通用语言元信息转换器

提供多语言支持(原先只支持 Java 语言),我又双叕开始造新轮子。...统一代码数据结构模型。 先是重写了 Coca 基础设施中 AST,再在其基础上提供了更通用代码模型,并添加了不同类型语言支持: ?...在实现过程中,慢慢成为代码/代码语法方面的专家。不同编程语言都有各自独特语法,都需要不断地熟悉相关语法。...插件化 AST:基于 Antlr AST 解析 有了基础模型之后,我们要做事情就是程序员应该做事情:AST 解析。我们需要编写多种编程语言 AST,好在我们已经有了 Antlr。...而社区也已经有各种使用 Antlr 编写编程语言 AST,见 Antlr 官方维护 https://github.com/antlr/grammars-v4/ 。

64820

Whosbug项目日志2

背景信息 团队规模 whosbug经手了多个团队近20人,历史团队中:大家分别负责插件和数据流转设计实现和优化、责任归属算法设计实现与优化、antlr语法AST分析多语言适配实现以及项目协同管理...bugfix) 项目目标 whosbug致力于解决责任人归属这一问题一个微服务,精确定位到每一个crash / bug责任人,缩短缺陷修复流程;同时也能在语法树这一层级为项目提供部分统计信息...使用Antlr作为AST解析工具,使用统一Go-Antlr Runtime 定义广义语法解析结构接口,覆盖所有适配语言,统一接口调用便于开发维护 4....Antlr-Go线程不安全 ​ AntlrGo Runtime原生并不是线程安全,而这一点在Antlrdoc里面没有明确指出,亦没有提供实现线程安全方法示例,在实现语法解析并发执行过程中遇到了阻力...,实现其线程安全 为Listener接口增加实现实例内共享变量,帮助AST分析获得完整语法解析树

41431

Hive源码系列(六)编译模块之词法、语法解析 (上)

词语或者叫单词就是那些无法再拆分最小具有概念意义单位。词语是由字母有序组成,但字母不具备概念意义。以单词为分界线,单词之上,组成结构元素都是具有概念意义。... 2、antlr工作流程 hive借助Antlr定义SQL词法规则和语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法AST Tree。...HiveSql后续编译过程全都基于AST Tree,所以我们想要完整理解hive sql编译过程,需要前置了解一下antlr是怎么工作 ?...总结一下,使用antlr需要我们提前定义好识别字符流词法规则和用于解释Token流语法分析规则。然后,antlr会根据我们提供语法文件自动生成相应词法/语法分析器。...我们可以利用他们将输入文本进行编译,并转换成抽象语法Ast Tree。 2、antlr环境准备 antlr是编译原理领域比较著名工具了,这次借助研究hive机会,安装使用一下antlr

1.1K20

Whosbug 2021项目日志

背景信息团队规模whosbug经手了多个团队近20人,历史团队中:大家分别负责插件和数据流转设计实现和优化、责任归属算法设计实现与优化、antlr语法AST分析多语言适配实现以及项目协同管理;...多语言支持适配性原版使用`ctags`作为`AST`解析工具时,对不同语言支持适配很难复用,需要针对每一种语言重新适配,几乎需要为每个语言设计不同接口,基本上不具有泛用性图片解决措施:使用Antlr...作为AST解析工具,使用统一Go-Antlr Runtime定义广义语法解析结构接口,覆盖所有适配语言,统一接口调用便于开发维护4....Antlr-Go线程不安全`Antlr``Go Runtime`原生并不是线程安全,而这一点在`Antlr``doc`里面没有明确指出,亦没有提供实现线程安全方法示例,在实现语法解析并发执行过程中遇到了阻力...Listener接口增加实现实例内共享变量,帮助AST分析获得完整语法解析树

32831

Antlr 重构脚本解释器

当我准备再新增一个 % 取模运算符时,会发现工作很繁琐而且几乎都是重复;主要是两步: 需要在词法解析器中新增对 % 符号支持。 在语法解析器遍历 AST 时对 % token 实现具体逻辑。...而我们要实现具体语法逻辑时只需要实现相关接口,Antlr 会自动遍历 AST(当然也可以手动控制),同时在访问不同 AST 节点时会回调我们自己实现接口,这样我们就能编写自己语法规则了。...这里也推荐在 IDE 中安装 Antlr 插件,这样就可以直观查看 AST 语法树,可以帮我们更好调试代码。...升级 xjson 借助 GScript 提供 statement,xjson 也提供了有些有意思写法: 因为 xjson 四则运算语法没有使用 Antlr 生成,所以为了能支持 GScript...提供 statement 需要手写许多词法代码。

73810

打破国外垄断,开发中国人自己编程语言(1):编写解析表达式计算器

还有就是JS是动态语言,如果将其转换为静态语言,会以牺牲性能为代价,而且无法有效融合单线程和多线程特性,并且还无法与UM IDE融为一体,所以没办法,才开发一款自己编程语言Ori,并且融合了数十种编程语言优秀特性...当然,可以直接在模块中引用antlr4库,不过将antlr4 运行时库与工程放到一起,这样如果将工程复制到其他机器上,就不会由于antlr4运行库没有复制而导致无法运行了。 ?...其实token是词法分析器输出,同时,token将作为语法分析器输入,而AST(抽象语法树)则是语法分析器输出。 token就是编程语言中不可再分单元,相当于编程语言原子。...Antlr4制作编译器过程就是先根据源代码生成AST,然后对AST进行遍历(根据语言特性,会遍历1到n遍),遍历完后,就会生成中间代码、以及最终二进制文件。所以AST起到了承前启后作用。...这里先要知道Antlr4是如何遍历ASTAntlr4有如下两种方式遍历AST: (1)listener (2)visitor 第一种方式更灵活,但不容易使用。visitor不灵活,但容易使用。

2.3K40

一门语言作用域和函数调用是如何实现

前言 上次利用 Antlr 重构一版 用 Antlr 重构脚本解释器 之后便着手新增其他功能,也就是现在看到支持了作用域以及函数调用。...整个程序运行过程分为编译期和运行期,对应流程: 遍历 AST 树,做语义分析,生成对应符号表、类型表、引用消解、还有一些语法校验,比如变量名、函数名是否重复、是否能访问私有变量等。...运行期:从编译期中生成符号表、类型表中获取数据,执行具体代码逻辑。 访问 AST 对于刚才提到编译期和运行期其实分别对应两种访问 AST 方式,这也是 Antlr提供两种方式。...Listener 模式 第一种是 Listener 模式,就这名字也能猜到是如何运行;我们需要实现 Antlr提供接口,这些接口分别对应 AST 树中不同节点。...作用域 即便是同一个语法生成 AST 是相同,但我们在遍历 AST 时实现不同也就会导致不同语义,这就是各个语言语义分析不同之处。

56240

Hive SQL底层执行过程详细剖析(好文收藏)

临时文件用于向计划中后面的 map/reduce 阶段提供数据。 步骤7、8和9:最终临时文件将移动到表位置,确保不读取脏数据(文件重命名在HDFS中是原子操作)。...Hive SQL编译过程 词法、语法解析: Antlr 定义 SQL 语法规则,完成 SQL 词法,语法解析,将 SQL 转化为抽象语法AST Tree; Antlr是一种语言识别的工具,可以用来构造领域语言...使用Antlr构造特定语言只需要编写一个语法文件,定义词法和语法替换规则即可,Antlr完成了词法分析、语法分析、语义分析、中间代码生成过程。...-23'; 阶段一:词法、语法解析 根据Antlr定义sql语法规则,将相关sql进行词法、语法解析,转化为抽象语法AST Tree: ABSTRACT SYNTAX TREE: TOK_QUERY...,通过限制 ReduceSinkOperator 生成内容来限制来自 mapper 输出 减少用户提交SQL查询所需Tez作业数量 如果是简单提取查询,避免使用MapReduce作业 对于带有聚合简单获取查询

6.2K30

我参与阿里巴巴 ASoC-Seata 一些感悟

由于之前有过了解 Antlr,感觉其更加灵活,拓展性更强,层次清晰更易维护,例如 Hive 和 Spark 使用 Antlr 生成词法语法解析器,Twitter 使用 Antlr 来解析用户输入查询内容...在实现解析数据库每种语法语句时候,比如 Mysql 新增语法,使用 Antlr Visitor 模式,并不兼容查询,修改,删除语法,不断打翻之前代码,不断调试,甚至导致Antlr 源文件变动(Antlr...官方提供源文件过大,改动很头疼)。...遇到事情不能急躁,冷静...它不是有 Ast 树吗,我在它遍历 Ast时候给它加上空格不就好了吗。...,同时也感谢社区张嘉伟大佬、陈健斌大佬、钟正涛大佬在我编程之夏之旅中提供帮助。

73820

回波总 - 为什么我不赞同你关于 ANTLR 不适合模板引擎意见

简单地说 ANTLR 是一个词法语法分析工具, 它不是一个应用层面的库, 也不是为应用程序开发使用. ANTLR 用户是需要定义某种语法, 并实现对该语法文件解析库开发者....下面列举几个使用 ANTLR 项目: Groovy - 解析 Groovy 源文件并生成 AST Cassandra - CQL 语法解析和词法分析 Salesforce APEX - APEX 脚本解析器...Twitter - 查询语言语法分析 StringTemplate - 模板引擎语法分析 Beetl - 模板引擎语法分析 波总在上篇博文评论中谈到: antrl 会为你生成一个人类根本无法阅读...如果因为"生成了一个人类无法阅读 parser" 就否定 ANTLR 在模板引擎应用, 那是不是也应该否定 ANTLR 在包括 Groovy 在内其他项目中使用呢?...更有趣ANTLR 作者还专门使用了 ANTLR 开发了模板引擎 StringTemplate 作为 ANTLR showcase, 难道他没有遇到这个 "生成一个人类根本无法阅读 parser

1.1K30

shell-编写shell脚本所需基础语法

,顾整理一下其基本语法,本文章主要内容来自菜鸟教程 , 也添加了一些知识点 看完这边文章应该就可以独立完成大部分脚本得编写,复杂脚本还需要一些其他不常用操作,到时候自行google吧 shell...shell 本身并不是内核一部分,它只是站在内核基础上编写一个应用程序。 那么什么是shell脚本呢?...shell脚本中最重要就是对shell命令使用与组合,再使用shell脚本支持一些语言特性,完成想要功能。...name=“test” (使用local修饰变量在函数体外无法访问,并且local只能在函数体内使用) 使用变量: echo $name 或者 echo ${name} (推荐使用大括号版)...如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null: 输入重定向 bash.sh < file : 将脚本输入重定向到file,由file提供参数 输出重定向

86620

M语言编程_所有编程语言大全

一套完整语言包含肯定不止解释执行器了,还要有编译器和IDE,也就还要有语法高亮、智能提示等,不过还没学会那些,先搞个最基本解释执行器。...思路如下: 定义好希望语法(基本语句有:顺序执行、if语句、for语句、while语句、系统自有函数定义、用户函数定义、函数调用) 找一款词法语法解析器工具,让字符串流变成语法书(AST) 编写解释执行器...,不贴代码了,可以下载代码看全部(基于ideas/需要安装antlr4插件) 接下来是时候让我们load进demo代码解析成AST树啦: String code=Utils.readTxtFile("...//解释器执行 System.out.println(""); AST节点定义: demo代码构建成AST效果图(antlr插件中能看): 转换成为AST树后,剩下就是编写解释执行器,其实相当于前端编译器...) { methods.put(identifier, ast); } } functionDeclare是具体node,属于AST中众多节点类型中一种,代表函数声明节点。

12.8K30

Antlr实战之JSON解析器slowjson

最近一直在学习编译原理,然后就了解到了antlr4这个强大工具,antlr全称是(Another Tool for Language Recognition),是一款很强大词法和语法分析工具,虽然是用...实际上你并不需要自己动手写词法分析器、语法分析器……,今天主角antlr都会帮你生成,你只需要用巴科斯范式把json语法规则描述清楚就行了,这份描述你可以直接在json.org找到,在antlrgithub...这里我直接用antlr提供规则描述。...(AST) return new objCtx; } 实际上你只需要写上面这么多代码,就可以完成对一个jsonStr解析,不过这里解析后结果是antlr内部封装抽象语法树...,利用antlridea插件,我们可以将解析后AST可视化出来, "{\"key1\":\"value1\",\"sub\":{\"subkey\":\"subvalue1\"}}"语法树长下面这样

1.3K10

Calcite系列(六):执行流程-语法解析

、标识符、标识符、字面量等 语法分析:识别出AST树状语法结构,可基于递归下降算法(自顶向下)构造,其中根节点(RootNode)可代表整个语法树 目前广泛使用语法解析框架主要包括ANTLR、JavaCC...在大数据领域中,很多计算引擎都是基于ANTLR进行语法解析,例如 Hive、Spark和Presto等都基于ANTLR进行处理。然而,Calcite使用JavaCC编译器进行语法解析。...Calcite中定义核心解析类方法: parseSqlStmtEof:解析单个SQL Statement,获取Root AST Node (SqlNode) parseSqlStmtList: 解析...类似 抽象语法树 在Calcite中,基于SqlNode表示AST抽象语法树,一个SqlNode可对应语法树中一个节点,即对应SQL语句中一个元素。...从整体上看,SQL解析将SQL转为AST抽象语法树,该语法树是朴素,无元数据绑定,也无法直接进行查询优化。

33073
领券