首页
学习
活动
专区
圈层
工具
发布

Antlr4 语法解析器(下)

语法文件中; Antlr4语法中,支持的关键字有:import, fragment, lexer, parser, grammar, returns, locals, throws, catch, finally..., mode, options, tokens 基于IDEA调试Antlr4语法规则(文法可视化) ?...目录下,取名 Test.g4 2)写一个简单的语法结构 这里我们参考写一个加减乘除操作的表达式,然后在赋值操作对应的Rule上右键,可选择测试: grammar Test; @header {...Maven Antlr4插件自动生成(针对Java工程,也可以用于Gradle) 此处使用第一种方式 访问者模式遍历Antlr4语法树 java -jar /usr/local/lib/antlr-4.7.2...一般来说,面向程序静态分析时,都是使用访问者模式的,很少使用监听器模式(无法主动控制遍历AST的顺序,不方便在不同节点遍历之间传递数据) Antlr4词法解析和语法解析 如前面的语法定义,分为Lexer

4.4K20

用antlr解析odata filter条件表达式

其实,简单讲,antlr就是一个非常方便的词法分析和语法分析的类库,基于这个类库,可以很容易的实现很多场景,比如计算器算术表达式的解析、各种编程语言的解析等。...具体odata filter条件表达式的定义可以参考odata官方文档,这里为了描述问题方便,简化基本规则如下: 最小的表达式符合模式 key operator value 表达式和表达式可以用逻辑运算符连接成一个新的表达式...首先,有一种方案:利用关键字(比如eq, AND等)来split这个filter string,在比较简单的情况下也许这个方案可行,但是如果有表达式嵌套的情况(上面第三个例子),直接split string...其实,我们可以看到odata filter条件表达式和计算器的算术表达式有些类似,它们都是非常典型的词法分析和语法分析案例,所以同样可以采用antlr来解析。...下面仅分享一些我使用antlr(antlr 4)解析odata filter条件表达式的经验总结: antlr的简单使用流程:定义grammar->生成对应语言(比如c#)的词法和语法分析代码->实现自己的

3.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    使用antlr4构造我的语法树

    词法规则玩玩是用类似于正则语法的表达式生成“有限状态机”算法,并根据这些算法切割出token。 词法规则负责从输入读取,并解析成一个个token符号。...词法规则 antlr语法表示规则,查看以下example: INTERGER: DIGIT+ |'0'[Xx] HEX_DIGIT+ ; 一个分号";"表示结束...(Rule) 词法分析是识别一个个token,而语法分析是识别出程序的语法树状结构。...参考这个网址给出的演示,https://resources.jointjs.com/demos/javascript-ast,如下的表达式将被解析出一颗AST树。...两者的区别是啥: image.png 3.2.1 使用listener模式 image.png 3.2.2 使用visitor模式 image.png 四、有什么用 可以模拟解析,了解学习某种编程语言特性

    10.3K332

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

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

    2.6K20

    正则表达式语法-正则表达式教程——语法篇

    正则表达式,名字听上去就没有吸引力,我发现很多前端对正则表达式都很难做到如数家珍,每次能够运行全凭运气正则表达式语法,更有甚者完全靠复制粘贴,其实这样并不好   正则表达式其实并不难,语法就那么多,而且一旦掌握在某些时候能够给解决问题提供捷径...,更重要的是面试可能会被问到,要是不会那就尴尬了   本文主要介绍正则表达式的语法部分,下面将正则表达式简称为正则   正则是啥?   ...正则表达式的语法一般如下(js),两条斜线中间是正则主体,这部分可以有很多字符组成;i部分是修饰符,i的意思表示忽略大小写   /^abc/i   正则定义了很多特殊意义的字符,有名词,量词,谓词等,下面逐一介绍...,正则中的量词有多个,如?...  有时我们想匹配x或者y,如果x和y是单个字符,可以使用字符集,[abc]可以匹配a或b或c,如果x和y是多个字符正则表达式语法,字符集就无能为力了,此时就要用到分组   正则中用|来表示分组,a|

    90020

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

    在编译阶段,需要进行词法和语法的分析。ANTLR聚焦的问题就是把源码进行词法和句法分析,产生一个树状的分析器。ANTLR几乎支持对所有主流编程语言的解析。...在理解正则表达式的基础上,ANTLR4的g4语法规则还是比较好理解的。...更重要的是,ANTLR4相比自行实现提供了更具想象空间的抽象逻辑,上升到了方法论的高度,因为它已经不局限于解决某个问题,而是解决一类问题。...可以说ANTLR相比于自行硬编码解决问题的思路有如数学领域普通的面积公式和微积分的差距。...但是在SQL语法中,我们查询数据表被抽象成了relation。 这个relation有可能来自于具体的数据表,或者是子查询,或者是JOIN,或者是数据的抽样,或者是表达式的unnest。

    2.8K10

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

    在编译阶段,需要进行词法和语法的分析。ANTLR聚焦的问题就是把源码进行词法和句法分析,产生一个树状的分析器。ANTLR几乎支持对所有主流编程语言的解析。...在理解正则表达式的基础上,ANTLR4的g4语法规则还是比较好理解的。...更重要的是,ANTLR4相比自行实现提供了更具想象空间的抽象逻辑,上升到了方法论的高度,因为它已经不局限于解决某个问题,而是解决一类问题。...可以说ANTLR相比于自行硬编码解决问题的思路有如数学领域普通的面积公式和微积分的差距。...但是在SQL语法中,我们查询数据表被抽象成了relation。 这个relation有可能来自于具体的数据表,或者是子查询,或者是JOIN,或者是数据的抽样,或者是表达式的unnest。

    2.3K30

    自研 DSL 神器:万字拆解 ANTLR 4 核心原理与高级应用

    有了这些 Java 文件,语言类应用程序的开发人员就不需要再去思考如何手动编写解析语法树的程序,因为ANTLR 4已经帮我们把这些事情都做了,ANTLR 4自带的jar 包和自动生成的这些语法分析器以及之后所提到的监听器...RuleNode 有一些令人熟悉的方法,例如 getChild() 和 getParent() ,但是,对于一个特定的语法,RuleNode 并不是确定不变的。...ANTLR 4 有两个预定义通道: 默认通道 (Token.DEFAULT_CHANNEL),通道号: 0,包含所有需要被解析器处理的标记。...自顶向下的语法和语法分析器的经典形式无法处理左递归。为了阐明这个问题,假设有一种简单的算术表达式语言,它包含乘法和加法运算符,以及整数因子。...大多数语法工具,例如Bison,使用额外的标记来指定运算符优先级。 与之不同的是,ANTLR 通过优先选择位置靠前的备选分支来解决歧义问题,这隐式地允许我们指定运算符优先级。

    13810

    java 正则表达式语法_JAVA正则表达式语法大全

    * 匹配前面的子表达式任意次。例如,zo*能匹配“z”,“zo”以及“zoo”。*等价于{0,}。 + 匹配前面的子表达式一次或多次(大于等于1次)。...\b 匹配一个单词边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的)。...如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。...\( \) 将 \( 和 \) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。...{i} {i,j} 匹配指定数目的字符,这些字符是在它之前的表达式定义的。

    2.8K30

    基于ANTLR4的大数据SQL编辑器解析引擎实践|得物技术

    基于以上场景我们核心要解决2个问题: 问题1:当前光标应该提示哪些推荐语法类型 目前,开源方案ANTLR-C3引擎就能完美解决我们问题,用户在编辑器实时输入时,获取当前光标位置,实时做语法解析,然后基于开源的...在 监听进入QueryStatment表达式采集当前表达式信息到_queryStmtsStack。...,但在实际中语法规则的整体嵌套层级是很深的,从以下的SparkSql语法定义中我们可以看到右侧聚合的表达式高达200+个,单个表达式的备选分支最多高达140+,这也加大了上下文分析采集的复杂度,即我们无法简单的从...SQL,会导致语法解析过程变得缓慢引发性能问题。...目前在性能优化上,有以下几个方向。

    1.4K10

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

    由于词法分析和语法分析有规律可循,所以出现了很多通过文法生成词法分析器和语法分析器的工具,由于词法分析与语法分析是编译器前端的重要组成部分,所以这类工具通常称为“编译器前端生成器”。...但如果要编写完善的代码,可能需要上百行才能实现(我们团队实现的Ori语言,利用antlr4生成的词法和语法分析器,总共6万行Go语言代码,我们自己编写了大概4万行Go代码,整个编译器有超过10万行代码,...如果要添加或修改原来的语法,只需要修改Hello.g4文件,然后再重新生成一遍即可。 现在有一个问题,怎么用Hello.g4生成的一堆文件呢?或者换种问法,生成的这些文件有什么用呢?...弄一个可以解析表达式的计算器 前面已经给出了一个完整的Antlr4案例,不过这个案例太简单了,没什么实际的用途,本节会利用Antlr4实现一个有实际价值的计算器程序。...java MarvelCalc expr.calc 会得到下面的结果: 11 533 87 我们可以看到,在expr.calc文件中,有3个可以计算的表达式,其中最后两个表达式使用了变量,而输出结果就是这

    3.1K40

    如何实现一个SQL解析器

    比如数据存储在MySQL、Oracle等关系型数据库中,有标准的SQL语法。...在大数据的一些SQL框架里面有有广泛的应用,比如Hive的词法文件是ANTLR3写的,Presto词法文件也是ANTLR4实现的,SparkSQLambda词法文件也是用Presto的词法文件改写的,另外还有...官网示例: ANTLR表达式assign : ID '=' expr ';' ;解析器的代码类似于下面这样: ANTLR解析器代码void assign() { match(ID); match('...词法分析阶段主要解决的问题是关键字以及各种标识符,比如INT(类型关键字)和ID(变量标识符)。...即定义一个表达式(如expr),可以循环调用直接也可以调用其他表达式,但是最终肯定会有一个最核心的表达式不能再继续往下调用了。

    3.7K31

    精读《设计模式 - Interpreter 解释器模式》

    不同的 SQL 方言有不同的语法,我们可以根据某种特定的 SQL 方言定制一套适配它的文法表达式,再利用 antlr 解析为一颗语法书。在这个例子中,antlr 就是解释器。...不同的语言有不同的文法表示,我们只需要一个类似 antlr 的通用解释器,通过传入不同的文法表示,返回不同的对象结构。...“并定义一个解释器”,这个解释器就是类似 antlr 的东西,传给它一个文法表达式,就可以解析句子了。即:解释器(语言, 文法) = 抽象语法树。...结构图 Context 是其他上下文变量,AbstractExpression 是抽象语法表达式。...这种将单个逻辑判断与文法组装解耦的做法,可以使逻辑判断与文法组装独立变换,使复杂语法解析转化为一个个具体的简单问题。 版权声明:自由转载-非商用-非衍生-保持署名(创意共享 3.0 许可证)

    65020
    领券