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

使用antlr4构造我语法

一、编译原理 编译器前端和后端。前端指的是编译器对程序代码分析和理解。前端阶段只与语言语法有关,而和目标机器无关。后端则是生成目标机器目标代码有关。第一节说说编译器前端技术。...词法分析是识别一个个token,而语法分析是识别出程序语法树状结构。...image.png image.png 1.3、语义分析 语义分析目的是消除语义模棱两可“二义性”。比如一个变量同时定义在花括号外部和内部,那么到底该用哪一个。...虽然是java实现编译工具,但是antlr支持生成cpp、java、python、c#等解析运行库,可以当做多种语言解析工具用。...这里以cpp举例。https://github.com/antlr/antlr4/tree/master/runtime/Cpp。把git工程拉到本地。

8.9K332

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

对于工业级编译器来说,并不会从0开始实现词法和语法分析器,并不是这东西有多难,而是如果完全手工编写代码,要添加或修改一个新语法,那简直就是一场噩梦,因为要修改非常多地方,而且一旦出错,非常不好找原因(...其中lex是专门用来生成词法分析,yacc用来生成语法分析,javacc可以同时生成词法和语法分析器、antlr也同样可以生成词法分析器和语法分析器。...这几种工具都是依赖于文法生成词法分析器和语法分析,例如,在antlr4,如果要识别加减乘除四则运算,只需要编写下面的文法即可。...我们使用了antlr4来生成词法分析器和语法分析器,所以先要配置一下antlr4开发环境。...如何用程序进行词法和语法分析 尽管已经了解了Antlr4基本使用方法,但到现在为止,还没有用Java编写过一行代码呢?现在我就来演示如何用Java调用上一节生成词法分析器和语法分析器。

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

一文了解函数式查询优化器Spark SQL Catalyst

parser切词 Spark 1.x版本使用是Scala原生Parser Combinator构建词法和语法分析器,而Spark 2.x版本使用是第三方语法解析器工具ANTLR4。...Spark2.x SQL语句解析采用ANTLR4,ANTLR4根据语法文件SqlBase.g4自动解析生成两个Java类:词法解析器SqlBaseLexer和语法解析器SqlBaseParser。...SqlBaseLexer和SqlBaseParser都是使用ANTLR4自动生成Java类。使用这两个解析器将SQL字符串语句解析成了ANTLR4ParseTree语法树结构。...RBO优化策略就是对语法树进行一次遍历,模式匹配能够满足特定规则节点,再进行相应等价转换,即将一棵树等价地转换为另一棵树。...比如join算子,spark根据不同场景为该算子制定了不同算法策略,有broadcastHashJoin、shuffleHashJoin以及sortMergeJoin,物理执行计划实际上就是在这些具体实现挑选一个耗时最小算法实现

2.8K20

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

整个程序运行过程分为编译期和运行期,对应流程: 遍历 AST 树,做语义分析,生成对应符号表、类型表、引用消解、还有一些语法校验,比如变量名、函数名是否重复、是否能访问私有变量等。...Listener 模式 第一种是 Listener 模式,就这名字也能猜到是如何运行;我们需要实现 Antlr 所提供接口,这些接口分别对应 AST 树不同节点。...接着 Antlr 会自动遍历这棵树,当访问和退出某个节点时变会回调我们自定义方法,这些接口都是没有返回值,所以我们需要将遍历过程数据自行存放起来。...作用域 即便是同一个语法生成 AST 是相同,但我们在遍历 AST 时实现不同也就会导致不同语义,这就是各个语言语义分析不同之处。...父级 scope 关系是在创建 scope 时候维护进去,默认当前 scope 就是写入时 scope 父级。

56940

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

,Oracle 把 Antlr 功能内嵌在 SQL 开发IDE,NetBeans IDE 使用 Antlr 解析 C ++ 语言,也有公司使用Antlr来从文件抽取信息等等......Antlr无疑是Seata SqlParser另一个更好选择。于是我想把 Antlr 带到Seata。 ?...在实现解析数据库每种语法语句时候,比如 Mysql 新增语法,使用 Antlr Visitor 模式,并不兼容查询,修改,删除语法,不断打翻之前代码,不断调试,甚至导致Antlr 源文件变动(Antlr...这里使用 Antlr v4.0.0 字符串流重写 LA 遍历方法,否则大小写转换出错,调用 MySqlLexer 进行词法分析,CommonTokenStream 符号分析,MySqlParser 执行语法规则分析调用我们自定义...过程很简单,但是在实际过程可能会遇到很多问题,比如新增语法,查询语法,修改语法,删除语法他们语法规则是否有通用性,实现方法是否可以公用,不同 sql 语法,是否同一个方法能支持,批量 sql 的话

74220

主要执行流程

预备知识 先介绍在Spark SQL两个非常重要数据结构:Tree和Rule。...SparkSql第一件事就是把SQLText解析成语法树,这棵树包含了很多节点对象,节点可以有特定数据类型,同时可以有0个或者多个子节点,节点在SparkSQL表现形式为TreeNode对象。...而Rule则是应用在Tree上规则,通过模式匹配,匹配成功就进行相应规则变换,若不成功则继续匹配子节点,如在Optimizer模块中有个常量累加优化规则,通过该规则,可以将两个常量节点直接转化为值相加后一个常量节点...Spark1版本使用是scala原生parser语法解析器,从2.x后改用是第三方语法解析工具ANTLR4,只需要定制好语法,可以通过插件自动生成对应解析代码。...然后通过AstBuilder配合antlrvisitor模式自主控制遍历Tree,将antlr里面的节点都替换成catalyst(优化器系统)里面的类型,所有的类型都继承了TreeNode特质,TreeNode

1.7K10

CMake使用教程和原理

解析器匹配器找到各种token。CMakeLists也可以解析外部CMake语法,他是由“include” 或者“add_subdirectory”包含进来,两者区别后面会说到。...解析器使用了lex/yacc语法解析器,执行构建动作。cmCommand定义了命令执行动作,并且该动作注释在代码也有注释。这些关键类 是抽象类,CMake跨平台实现依赖于这些类平台实现类。...:查找dir路径下所有源文件,保存到variable变量....---------  # PREFIX             ${ANTLR4CPP_EXTERNAL_ROOT}   PREFIX             ${ANTLR4CPP_LOCAL_ROOT...${ANTLR4CPP_LOCAL_REPO}   # GIT_TAG          ${ANTLR4CPP_EXTERNAL_TAG}   TIMEOUT            10   LOG_DOWNLOAD

11K296

探究Presto SQL引擎(1)-巧用Antlr

在编译阶段,需要进行词法和语法分析ANTLR聚焦问题就是把源码进行词法和句法分析,产生一个树状分析器。ANTLR几乎支持对所有主流编程语言解析。...使用ANTLR4工具处理g4文件,生成词法分析器、句法分析器代码、词典文件。 编写代码继承Visitor类或实现Listener接口,开发自己业务逻辑代码。...Listener模式访问栈清晰明确,Vistor模式是方法调用栈,如果实现出错有可能导致StackOverFlow。 通过这个简单例子,我们驱动Antlr4实现了一个简单计算器。...接下来图穷匕首见,展示出我们真正目的:研究ANTLR4在Presto如何实现SQL语句解析。 支持完整SQL语法是一个庞大工程。...用该解析器实现select field from table语法,从本地csv数据源查询指定字段。

2.1K10

探究Presto SQL引擎(1)-巧用Antlr

在编译阶段,需要进行词法和语法分析ANTLR聚焦问题就是把源码进行词法和句法分析,产生一个树状分析器。ANTLR几乎支持对所有主流编程语言解析。...使用ANTLR4工具处理g4文件,生成词法分析器、句法分析器代码、词典文件。 编写代码继承Visitor类或实现Listener接口,开发自己业务逻辑代码。...Listener模式访问栈清晰明确,Vistor模式是方法调用栈,如果实现出错有可能导致StackOverFlow。 通过这个简单例子,我们驱动Antlr4实现了一个简单计算器。...接下来图穷匕首见,展示出我们真正目的:研究ANTLR4在Presto如何实现SQL语句解析。 支持完整SQL语法是一个庞大工程。...用该解析器实现select field from table语法,从本地csv数据源查询指定字段。

1.6K30

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

解析流程 语法解析是SQL处理第一步,主要由词法分析语法分析两个步骤组成: 词法分析:分词操作,基于生成工具(正则文法+有限状态自动机DFA)将SQL分词为Token(词法记号),并识别Token为关键字...、标识符、标识符、字面量等 语法分析:识别出AST树状语法结构,可基于递归下降算法(自顶向下)构造,其中根节点(RootNode)可代表整个语法树 目前广泛使用语法解析框架主要包括ANTLR、JavaCC...在大数据领域中,很多计算引擎都是基于ANTLR进行语法解析,例如 Hive、Spark和Presto等都基于ANTLR进行处理。然而,Calcite使用JavaCC编译器进行语法解析。...在Calcite,Parser.jj是最核心词法&语法分析文件。...类似 抽象语法树 在Calcite,基于SqlNode表示AST抽象语法树,一个SqlNode可对应语法一个节点,即对应SQL语句中一个元素。

40673

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

我们把这个阶段叫做语法分析 弄清楚了我们词法、语法规则后,我们需要以antlr语言把这些写出来。...Antlr语法文件通常会保存在一个 .g文件,我们语法文件叫做 Caculator.g,保存在E:\hive\anltr\calculator 目录 下 在E:\hive\anltr\calculator...运行调试,点击图标小甲虫 ? 在弹出来调试界面,选择 text 输入 1+2 ? ? 之后将会在output窗口看到被识别出来token流,以及具体语法分析树和ASTTree结果 ? ?...以上设置完了之后,点ok 在Calculator.g文件输入内容: ? 点击Interpreter,在expr区域输入表达式1+2 点击执行按钮: ? 我们可以看到下图中具体语法分析结果 ?...3、用java来获取ASTTree antlr自动生成了词法分析器CalculatorLexer.java和语法分析器 CalculatorParser.java代码 ?

1.4K40

打破国外垄断,开发中国人自己编程语言(2):使用监听器实现计算器

其中CalcListener.java文件是Listener接口文件,接口中方法会根据Calc.g4文件产生式生成,该文件代码如下: import org.antlr.v4.runtime.tree.ParseTreeListener...要回答这个问题,就要先分析一下上一篇文章编写EvalVisitor类代码了。...类中有一个error变量,用来标识分析过程是否有错误,在Listener同样需要; (3)每一个visitXxx方法都有返回值,其实这个返回值是向上一层节点传递值。...false; // 用于标识分析过程是否出错 // 设置值 public void setValue...本文实现程序还支持错误捕捉,例如,将最后一个表达式变量x改成xx,再执行程序,就会抛出异常,出错表达式没有输出任何值,异常会指示出错位置(行和列),如下图所示: ?

75930

antlr4入门篇

环境准备 ANTLR实际上有两件事:一种将您语法转换为Java(或其他目标语言)解析器/词法分析工具,以及生成解析器/词法分析器所需运行时。...ANTLR对待导入语法非常类似于面向对象编程语言对待超类。语法从导入语法继承所有规则,标记规范和命名操作。“主语法规则会覆盖导入语法规则以实现继承。...要处理主语法ANTLR工具会将所有导入语法加载到从属语法对象。然后,它将规则,标记类型和命名操作从导入语法合并到主语法。...ANTLR在主词法语法中将导入规则添加到规则列表末尾。这意味着主语法词法分析器规则优先于导入规则。...前者将代码注入到识别器类定义之前生成识别器类文件,后者将代码作为字段和方法注入到识别器类定义。 对于组合语法ANTLR将动作同时注入解析器和词法分析器。

4.1K10

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

来,一起用高效(hard way)方式学习多种编程语言,Kotlin + Scala、Python、Go、Java、TypeScript、C#…… Chapi 起源 为了向开源重构与分析工具 Coca...在过去半个月里,我在这个项目上编写了大量代码,一些有意思内容、特性如下所示: 完全 TDD 项目。只有充分测试,才能保证语法解析不出错。 Kotlin 语言。...在实现过程,慢慢成为代码/代码语法方面的专家。不同编程语言都有各自独特语法,都需要不断地熟悉相关语法。...插件化 AST:基于 Antlr AST 解析 有了基础模型之后,我们要做事情就是程序员应该做事情:AST 解析。我们需要编写多种编程语言 AST,好在我们已经有了 Antlr。...而社区也已经有各种使用 Antlr 编写编程语言 AST,见 Antlr 官方维护 https://github.com/antlr/grammars-v4/ 。

65520

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

这些都是hive获取asttree过程,理解了这些,再理解hiveasttree就很容易了()。 最后 详细介绍hive词法、语法解析源码 以及hive AstTree使用 (下) ?...ps: 可以这么简单理解hive词法、语法解析 sql是由若干个单词组成 hive词法分析,就是分析sql里每个单词该怎么组成, hive语法分析,就是研究这些单词该以怎样结构组成一个sql...语法分析器(Parser):语法分析器将把收到Tokens组织起来,并转换成语法规则定义所允许结构。...树分析器(TreeParser):树分析器可以用于对语法分析生成抽象语法树进行遍历,并能执行一些相关操作。...总结一下,使用antlr需要我们提前定义好识别字符流词法规则和用于解释Token流语法分析规则。然后,antlr会根据我们提供语法文件自动生成相应词法/语法分析器。

1.1K20

Guarding:开源多语言架构守护工具

当然了,还有很多语法还在开发。 Guarding 可以很支持中文。但是,我觉得这中英文模板切换就是个问题。...起先在设计 Guarding 时候,我是打算使用类似于 Coca 方式,基于 Antlr 官方维护一个三方贡献语法库。而对于我来说,这是一种旧解析方式,所以我使用它可能性不大。...基于 Ctags 语法分析。另外一种选择是使用在设计 Modeling 时候,引入是 Ctags。...基于 LSP 语法分析。我短暂评估过采用 LSP (Language Server Protocol )方式,但是使用 LSP 意味着:引入更多语言相关依赖。所以,依旧是不可行路线。...CPP 代码解析成语法树 (部分): translation_unit [0, 0] - [6, 0] class_specifier [0, 0] - [4, 1] name: type_identifier

76020

日常运维|语法分析解析工具之ANTLR4(一)

ANTLR实现数据加载器、语言解释器、语言翻译器。基于自动生成语法分析树解析文件。...简单来说就是,ANTLR根据用户自定义语法文件自动生成词法分析器和语法分析器,并将输入文本处理为语法分析树(可视化)。...ANTLR 是一款强大语法分析器生成工具,可用于读取、处理、执行和翻译结构化文本或二进制文件。...解析C++Hibernate对象-关系映射框架(ORM)处理HQL语言其他文件读取器、遗留代码转换器、维基文本渲染器、JSON解析器、DNA模式匹配、数据读取、语言解释、翻译器1.2、简单描述生成语法分析器自动建立语法分析树自动生成树遍历左递归...语法分析树监听器语法分析树访问器3.1 入门例子编写一个ArrayInit.g4文件// 定义文件,程序语言名称必须同文件名称一致,都为ArrayInitgrammar ArrayInit;// 规则

59220

会员权益核心引擎ZCube原理与实践

语法分析(Parser):将Token流进行分析组合形成语句,如果语法分析通过,就可以得到一颗以树状形式表现编程语言语法结构抽象语法树AST。...在了解这些基础概念后,下节将结合示例具体分析脚本式、向导式建模过程。 2.1.2脚本式建模原理介绍 首先,基于ANTLR定制词法规范、语法规范、生成词法解析器、语法解析器等代码。...ZCubeParserLexer.tokens ZCubeParserLexer.java ANTLR能够自动识别出我们语法文法规则和词法规则。...ZCubeParserParser.java 该文件包含一个语法分析器类定义,这个语法分析器专门用来识别我们“数组语言”语法ArrayInit。...Constant const-label 常量标题 const-category 常量名称 Input content 为页面输入常量值 ......

93411

如何实现一个SQL解析器

在使用SQL解析器时,解析SQL步骤与我们解析Java/Python程序步骤是非常相似的,比如:在C/C++,我们可以使用LEX和YACC来做词法分析语法分析在Java,我们可以使用JavaCC...使用ANTLR来实现一条SQL,执行或者实现过程大致是这样,实现词法文件(.g4),生成词法分析器和语法分析器,生成抽象语法树(也就是我常说AST),然后再遍历抽象语法树,生成语义树,访问统计信息...语法分析主要是基于词法分析结果,构造一颗语法分析数,流程大致如下:因此,为了让词法分析语法分析能够正常工作,在使用ANTLR4时候,需要定义语法(Grammar)。...内容演示了词法分析语法分析简单流程,但是由于ANTLR要实现SQL查询,需要自己定义词法和语法相关文件,然后再使用ANTLR插件对文件进行编译,然后再生成代码(与Thrift使用类似,也是先定义接口...ANTLR是比较简单,开发无需关注词法和语法文件定义和编写,只需关注具体业务逻辑实现。

2.3K30

浅尝antlr4

浅尝Antlr4 前言 Antlr是什么 In a word, 多源语言多目标语言一个语法分析框架 以下是官方文档解释: ANTLR(ANother Tool for Language Recognition...Github项目地址 这次使用antlr诱因是whosbug中使用ctags(另一个语法分析器)只对c系语言支持较好,对java等语言支持欠佳(甚至可以说很差了),为了whosbug鲁棒性我认为还是有必要换一个语法分析...几个需要了解词 AST:抽象语法树 target language:antlr可以根据源语言.g4文件生成不同语言(target language)分析代码 各种target language...文档(有些很简略) Lexer:antlr词法分析器(词法分析) Parser:antlr语法分析器(语法分析) Listener:是antlr独有概念,与传统源码分析不同,antlr提供...python分析模块 获取.g4语法文件 ANTLRGitHub项目中提供了用于不同语言语法文件(.g4) 官方g4文件收录库 这次需求先重点解决java语法分析问题,所以一开始我找到了java9

1.6K21
领券