语法分析-Antlr
文章平均质量分 72
可免费问问题,可以一次订阅,终身免费问问题。Antlr专业级别学习,从入门到精通,贼赞,里面有很多由浅入深的案例
优惠券已抵扣
余额抵扣
还需支付
¥29.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
九师兄
可免费问问题,可以一次订阅,终身免费问问题。工作多年遇到的问题,与一些总结,注意事项等,有些是源码级别的讲解,同时整个博客是成体系的,里面有很多连接互相连接,问题都是拆开的,能让大家遇到问题的时候方便的解决问题,或者提供思路。也可以单独找我解决问题。
展开
-
【Antlr】Could not deserialize ATN with version 3 expected
本次是运行flink的时候报错,我们的flink使用了antlr做语法解析,然后升级了antlr版本,但是antlr生成的类,没有重新生成导致报错这个,把一些通过G4文件生生的类,重新生成就好了。原创 2024-02-20 23:15:00 · 433 阅读 · 0 评论 -
【Antlr】处理同一文件中的不同格式
在命令行中,XML tokens序列处通常是一个语法名字后面跟着开始规则,但在这里,我们使用语法名字后面跟着特殊的规则名字tokens来告诉TestRig应该运行词法分析器而不是语法分析器。ANTLR有提供一个称之为“词法模型”的词法分析器特性,它让我们可以很容易地处理包含混合格式的文件。基本思路是:当词法分析器看到特殊的哨兵字符序列时,让它在模式之间来回切换。上面输出的每一行代表一个记号,包含记号索引、开始和结束字符、记号文本、记号类型,最后的行和字符位置则告诉我们词法分析器如何标记化输入。原创 2024-02-20 23:30:00 · 61 阅读 · 0 评论 -
【Antlr】使用语义谓词改变语法分析
当计算结果为false时,谓词让相关的选项从生成的语法分析器中“消失”。有一个读入整数序列的语法,它的玄机是由输入的部分指定有多少个整数组合在一起,所以我们必须等到运行时才能知道有多少整数被匹配。我们的目的是设计一个语法IData.g,把9和10组合在一起,把1、2和3组合在一起。这个图不对,应该是有2个组的,第一个组下面是 INT:2 然后是9,10,第二个组是INT:3 然后是123.虽然大部分时间我们不需要这样的微管理,但它至少让我们知道我们有这样的武器可以处理病理分析问题。原创 2024-02-19 23:30:00 · 67 阅读 · 0 评论 -
【Antlr】Antlr 在语法中嵌入任意的操作
如果我们不想付出构建语法分析树的开销,或者想要在分析期间动态地计算值或把东西打印出来,那么可以通过在语法中嵌入任意代码实现。它的比较困难的,因为我们必须明白在语法分析器上的操作的影响,以及在哪里放置这些操作。匹配这种类型的输入在语法上还是相当简单的。获取最近匹配的STUFF记号的文本内容。STUFF词法规则匹配任何非TAB或换行的字符,这意味着在列中可以有空格字符。操作的代码将会被注入到生成的语法分析器类中的成员区;在规则row中的操作访问的。在上述语法中,操作是被花括号括起来的代码片段;原创 2024-02-16 10:21:20 · 65 阅读 · 0 评论 -
【Antlr】自顶向下的设计模式 案例
相信大家也能体会到使用 antlr4 工具带来的开发效率的提升,无需关注过多的语法解析方面的实现细节,让我们能够把更多的精力去聚焦在我们需要考虑的业务逻辑方面。antlr4 就是按照自顶向下的解析方式进行解析,我们可以按照语法 2-1 的描述,将表达式 10-3/(8-1*4) 从左向右展开一下。,按照右边的方式进行展开,上面所展示的展开的过程,就相当于图 所示的树形结构的。按照这种思维方式,自底向上的解析方式,就是按照语法规则,假设我们有一个一个简单识别表达式的例子。自顶向下的解析方式,就是将语法的。原创 2024-02-15 11:25:50 · 163 阅读 · 0 评论 -
【Antlr】antlr4 简介
ANTLR(全名:ANother Tool for Language Recognition)是基于LL(*)算法实现的语法解析器生成器(parser generator),用Java语言编写,使用自上而下(top-down)的递归下降LL剖析器方法。由旧金山大学的Terence Parr博士等人于1989年开始发展。原创 2024-02-15 11:25:34 · 151 阅读 · 0 评论 -
【Antlr】Antlr g4文件概览
在深入介绍之前,有必要先给大家了解一下g4文件的结构,以便对如何编写语法规则文件有个全局的认识,我想这是大有禆益的。因为这样我们就可以很清晰地知道需要的东西写在哪里,或者哪些东西是无法加到antlr中的。superClasslanguagetokenVocab@header@member如果要指定在lexer或者parser中,可以使用。antlr由两个东西组成,一个叫词法,一个叫语法,语法是由一个个词法堆积而成的。在antlr中,英文的说法是Lexer、Parser,分别对应词法、语法。标识符。原创 2024-02-11 13:21:21 · 529 阅读 · 2 评论 -
【Antlr】Antl 语法参考、命令行参数
出自:antlr 权威指南 并且补充,仅供自己学习使用,方便查找。如果调用ANTLR工 具时没有传递命令行参数,你会看到一些帮助信息。原创 2024-02-07 22:34:29 · 221 阅读 · 0 评论 -
【Antlr】Antl 语法参考、选项
20240207日,我们订婚啦出自:antlr 权威指南 并且补充,仅供自己学习使用,方便查找。有许多语法元素和规则元素级别的选项可被设定(当前,暂时还没有规则选项)。它们能够改变ANTLR根据语法生成代码的方式。通用形式如下:其中的value可以是标识符、全限定标识符(如a.b.c)、字符串、花括号包围的多行宇符串,以及整数。原创 2024-02-07 22:34:10 · 294 阅读 · 0 评论 -
【Antlr】Antl 语法参考、语义判定
出自:antlr 权威指南 并且补充,仅供自己学习使用,方便查找。语义判定{..}?是使用目标语言编写的布尔表达式,它指示了沿当前判定所守护”的路径继续进行语法分析的可行性 和动作一样,判定可以出现在文法规则的任意位置,。我们已经在第11章中详细讨论了判定。本节将对文法规则和词法规则中的语义判定进行完整的总结。下面让我们一起深入了解语法分析器在语法分析的決策过程中是如何与判定协同工作的。原创 2024-02-07 22:33:47 · 55 阅读 · 0 评论 -
【Antlr】Antl 语法参考、通配符与非贪婪子规则
antlr 权威指南并且补充,仅供自己学习使用,方便查找。诸如的EBNF子规则是贪婪的(greedy) 它们会消费尽可能多的输入文本,在某些情况下,这是我们所不希望看到的。在词法分析器和部分 语法分析器中,类似*的结构会持续匹配到输入文本的未尾。。我们可以通过添加?后缀的方式使任意以?、*或+结尾的子规则变成非贪婪的。非贪婪子规则在词法分析器和语法分析器中都是被允许的,不过在词法分析器中的应用更为广泛。原创 2024-02-07 22:33:27 · 79 阅读 · 0 评论 -
【Antlr】Antl 语法参考、词法规则
antlr 权威指南并且补充,仅供自己学习使用,方便查找。词法语法由词法规则组成,并且可被分解为多个模式,正如我们在12.3节〞使用词法模式处理上下文相关的词法符号” 部分中看到的一样。词法模式允许我们将一份词法语法分解成多个子语法。词法分析器只能返回当前模式下的规则匹配到的词法符号。词法规则的定义方式和文法规则非常相似,除了一些例外:词法规则不能包含参数、返回值或者局部变量。词法规则名必须以大写字母开头,以和文法规则名区分开。原创 2024-02-06 12:00:41 · 185 阅读 · 0 评论 -
【Antlr】Antl 语法参考、动作和属性
antlr 权威指南并且补充,仅供自己学习使用,方便查找。在第10章中,我们已经学习了如何在语法中嵌入动作,也看到了最常见的词法符号和规则属性本节总结了其中的重要句法和语义,提供了一份所有可用属性的完整清单。动作是以目标语言编写的,位于花括号中的文本块,识别器根据它们在语法中的位置,在不同的时机触发之。例如,下列规则在语法分析器发现有效的定义后,打印出found a deci大多数情况下,动作会访问特定的词法符合和规则引用属性。原创 2024-02-06 12:00:23 · 108 阅读 · 0 评论 -
【Antlr】Antl 语法参考、文法规则
我们需要了解许多与规则和动作相关的语法元素。规则可以像编程语言中的函数一样,包含参数、返回值以及局部变量(在规则的元素中,可以嵌入动作,我们将会在15.4节中予以学习)。ANTLR会将你定义的所有变量收集起来并存储到规则上下文对象中,这些变量通常称为属性。下面的通用形式展示了所有可行的属性定义位置:定义在[....]中的属性的使用方法和其他任意变量一样。下面的示例规则将参数值传递给返回值:在语法层面上,你可以指定规则级的具名动作。这样的有效命名包括init和after。原创 2024-02-04 12:59:47 · 68 阅读 · 0 评论 -
【Antlr】Antl 语法参考,基本词法、基本语法、注释
antlr 权威指南并且补充,仅供自己学习使用,方便查找。原创 2024-02-04 12:58:28 · 244 阅读 · 0 评论 -
【Antlr】Antlr 移除直接左递归
antlr 权威指南并且补充在5.4节中我们看到,用自然方式处理算术表达式是具有歧义性的。例如,下列expr可 以将1+2*3解释为通过优先选择位置靠前的备选分支,ANTLR优雅地解决了歧义问题。exor规则仍然是左递归的,传统的自顶向下的语法(例如ANTLR 3) 无法处理这样的规则。在本章中,我们会探究ANTLR处理左递归和运算符优先级的方式。简单而言,ANTLR将左递归替换成一个(...)*它会比较前一个和下一个运算符的优先级。原创 2024-02-03 08:55:19 · 174 阅读 · 0 评论 -
【Antlr】Antlr 运行时API
antlr 权威指南并且补充。原创 2024-02-03 08:54:57 · 300 阅读 · 0 评论 -
【Antlr】Antlr 对 XML 进行词法分析和语法分析
参考权威指南 12.4章节,本章节不想看。出自:antlr 权威指南 并且补充。原创 2024-02-03 08:54:43 · 367 阅读 · 0 评论 -
【Antlr】Antlr 字符流中的孤岛
antlr 权威指南并且补充迄今为止,我们讨论的所有输入文件都只包含一种语言。例如,DOT、CSV、Python 和Java的文件都只包含这些语言的文本。不过,还存在另外一些格式的文件,其中的结构化区域一或者称为孤岛----被随机的文本所包围。我们称这样的格式为孤岛语言 (island language),并且使用孤岛语法 (island grarnmar) 来描述它们。孤岛语言的例子包括 String Template 和LaTex这样的模板引擎语言,不过以XML最为突出。原创 2024-01-30 22:38:13 · 75 阅读 · 0 评论 -
【Antlr】上下文相关的词法问题
上一篇文章:antlr 权威指南并且补充考虑这样一个句子“ Brown leaves in the fall°。它是有歧义的,因为存在两种解释。如果我们指的是树木的叶子,这句话就是在描述一种自然现象。但是,如果我们正在谈论一位Jane Brown女士,这句话的意义就完全被上下文改变了。”Leaves” 就从名词变成了动词。这种情况类似我们在11.3节中解决的问题:Ct+中存在上下文相关的语句,如下T (0)既可以是函数调用语句,也可以是类型转换语句,它的具体含义取决于当前程序中的T定义。原创 2024-01-30 13:10:08 · 66 阅读 · 0 评论 -
【Antlr】Antlr识别歧义性文本
在开始本节的学习之前,我必须指出,如果一份语法能够以多种方式匹配输入的文本,那么,通常情况下,这份语法是有问题的 (a grammar bug)。例如,Ruby中的f(0)既是数组的第一个元素的引用,又是取函数f()返回的数组结果的第一个元素。这些语言的语法需要具有一定的歧义性,不过,歧义性语句在具体的上下文中就会具有清晰的含义,例如标识符的定义(作为类名还是函数名)。现在,我们的目标是,在处理具有歧义的输入文本时,强制语法分析器只留下一种解释方式,而将其余的解释方式全部关闭。考虑C++中的T (i)。原创 2024-01-30 13:09:52 · 67 阅读 · 0 评论 -
【Antlr】Antlr 关闭 词法符号
上一篇文章:antlr 权威指南并且补充在本节中,我们将会重新解决上一章的问题,不过这次是通过在词法分析器而非语法分析器中使用判定。我们的主要思想是,我们会在Java 5之前的模式中,关闭把enum当作关键字的词法规则,将其作为一个常规的标识符处理。在Java 5模式中,我们会将enum当作一个关键字类型的词法符号处理。这大大简化了语法分析器,因为它可以通过常规的ID词法符号来匹配标识符,而无须使用id规则。词法分析器应当只在当前方言允许的情况下输出1D。原创 2024-01-29 18:58:00 · 49 阅读 · 0 评论 -
【Antlr】Antlr属性和动作-识别关键字不固定的语句
1.概述上一篇文章:antlr 权威指南并且补充为探究内嵌在词法规则中的动作的相关知识,让我们为一门虛拟的、关键宇会动态变化 (每次运行都不同)的编程语言编写一份语法,这件事情听上去不可思议,但确实是可能的。例如,Java 5新增了一个关键字enum,因此同一个编译器必须能够根据“-version”态地开启和关闭它。也许,更常见的应用是处理拥有巨量关键宇集合的语言。原创 2024-01-29 18:57:48 · 287 阅读 · 0 评论 -
【Antlr】Antlr属性和动作-访问词法符号和规则的属性
上一篇文章:antlr 权威指南并且补充让我们以6.1节中的CSV语法为基础,学习一些与动作相关的特性。我们会编写一个程序,解析并打印CSV文件中的数据,它会为每行生成一个从列名到字段值的Map。我们的目的是学习更多有关规则动作和属性的知识。先看看 6.1节中的CSV语法 文件如下首先,让我们看看如何使用locals区域 (section)定义局部变量。经过定义参数和返回值后,locals区域中的声明就会成为规则上下文对象的字段。原创 2024-01-28 13:54:53 · 54 阅读 · 0 评论 -
【Antlr】Antlr属性和动作-使用带动作的语法编写一个计算器
antlr 权威指南并且补充在之前的学习中,我们的程序逻辑代码都是与语法分析树遍历器分离的,这意味着我们的代码总是在语法分析完成之后执行。在接下来的几章中我们可以看到,一些语言类应用程序需要在语法分析的过程中执行自身的逻辑代码。为了达到这个目的,我们需要一种手段,将代码片段 – 称为动作- 直接注入ANTLR生成的代码中。本章的的第一个目标是,学习如何在语法分析器和词法分析器中嵌入动作,并弄清楚我们可以在这些动作中放置哪些内容。请记住,通常我们应当避免将语法和应用程序的逻辑代码纠缠在一起。原创 2024-01-28 13:54:41 · 62 阅读 · 0 评论 -
【Antlr】Antlr must label all alternatives or none
意思是要么都加 动作,要么都不加动作,不能一部分加,一部分不加。今天写G4文件的时候,发现报错这个。原创 2024-01-26 22:12:13 · 79 阅读 · 0 评论 -
【Antlr】修改 Antlr 的错误处理策略
antlr 权威指南并且补充默认的错误处理机制表现出色,不过我们还是会遇到一些非典型的、需要修改默认机制的场景。首先,我们希望关闭某些默认的错误处理功能,它们会带来额外的运行负担。其次,我们可能希望语法分析器在遇到第一个语法错误时就退出。这种情况的例子是,当处理类似bash的命令行输入时,从错误中恢复是毫无意义的。我们不能一意孤行地执行有风险的命令,因此语法分析器可以一遇到问题就退出。原创 2024-01-26 22:11:43 · 387 阅读 · 0 评论 -
【Antlr】Antlr 勘误备选分支
antlr 权威指南并且补充。原创 2024-01-26 22:11:11 · 148 阅读 · 0 评论 -
【Antlr】Antlr 修改和转发Antlr的错误消息
antlr 权威指南并且补充默认情况下,ANTLR将所有的错误消息送至标准错误(standard error),不过我们可以通过实现接口改变这些消息的目标输出和内容。该接口有一个同时应用于词法分析器和语法分析器的syntaxError()方法。syntaxError()方法接收各式各样的信息,无论是错误的位置还是错误的内容。它还接收指向语法分析器的引用,因此我们能够通过该引用来查询识别过程的状态。使用这种方法,我们的程序就能在语法分析器调用起始规则之前,轻易地为其增加一个错误监听器。原创 2024-01-23 13:17:43 · 410 阅读 · 0 评论 -
【Antlr】Antlr 错误处理入门
出自:antlr 权威指南 并且补充同绝大多数软件一样,在我们开发一门语法的过程中,需要修复很多的错误。直到我们编写完 (并调试完)语法之后,生成的语法分析器才能识别所有的有效输入语句。在这个过程中,ANTLR的错误消息含有丰富的信息,有助于我们调试语法中产生的问题。.一旦拥有了正确的语法,我们就必须处理不合语法的语句,这些语句可能来源手用户输入,甚至是其他程序在错误情况下自动生成的。在上述情况下,我们的语法分析器对非法输入的响应就会大大影响生产力。原创 2024-01-23 09:19:21 · 339 阅读 · 0 评论 -
【Antlr】Antlr 验证程序中符号的使用
确定了全局的策略,我们就可以开始编写验证器了,不妨从DeiPhase开始。它需要三个字段:一个全局作用域的引用、一个用于追踪我们创建的作用域的语法分析树标注器,以及一个指向当前作用域的指针。监听器方法ebterFile()启动了整个验证过程,并且创建了一个全局作用域。最后的exitFile()。方法负责打印结果。当语法分析器发现一个函数定义时,我们的程序就需要创建一个FunctionSymbol对象。FunctionSymbol对象有两项职责:作为一个符号,以及作为一个包含参数的作用域。原创 2024-01-19 13:11:29 · 74 阅读 · 0 评论 -
【Antlr】Antlr 生成调用图
另一种我喜爱的可视化方案称为调用图,其中的节点是函数,节点间的有向边是函数的调用。当语法分析器遇到函数声明的时候,我们的程序将会把该函数的名宁加入一个列表中,然后在一个名为currentFunctionName的宇段中记录它。例如,我们需要基于之前的例子t.cymbo/生成一个如下所示的DOT文件。通过语法分析树和上面的FunctionListener类,我们就可以用我们在遍历中使用我们自定义的监听器,并产生我们期望的输出。之后,让我们将所有与图相关的代码都封装进一个类中,作为我们的语言类应用程序的基础。原创 2024-01-19 09:13:03 · 105 阅读 · 0 评论 -
【Antlr】Antlr 解析 DOT 格式
任意的由双引号包围的字符序列。原创 2024-01-18 23:00:00 · 285 阅读 · 0 评论 -
【Antlr】Antlr 将 JSON 翻译成XML
antlr权威指南并且进行补充。许多网络服务返回JSON数据,有时候,我们希望将一些JSON数据输入某个只接受XML的程序。让我们以6.2节中得到的JSON语法为基础,构建一个从JSON到XML的翻译器。我们的目标是读取这样的输入:并且给出等价的XML其中,是一个我们需要在翻译过程中生成的标签。和CSV语法一样,让我们首先对JSON语法中的备选分支做一定的标记,以便ANTLR生成更精确的监听器方法我们会用同样的方法处理value 规则,不过稍微做出了一些改变。原创 2024-01-17 20:29:54 · 75 阅读 · 0 评论 -
【Antlr】Antlr 加载CSV数据
antlr权威指南并且进行补充。我们的目标是编写一个自定义的监听器,将逗号分隔符文件(CSV) 中的数据加载到一种精心设计的数据结构的List” 中。这是一件其他数据读取器甚至一个配置文件读取器都能够完成的事情。我们会为每个行建立个Map,其中包含从列名到字段的映射。因此,对于如下输入文件:我们预期的“由Map组成的List”如下所示:为获得更精确的监听器方法,让我们对6.1节中完成的CSV语法的备选分支进行标记。除此之外,这个CSV语法和之前的版本相同。原创 2024-01-16 21:40:43 · 832 阅读 · 0 评论 -
【Antlr】Antlr 在事件方法中共享信息、参数传递、上下游信息传递、遍历信息传递、全局变量
antlr权威指南并且进行补充。不论是出于收集信息还是计算的目的,。但是,问题在于,ANTLR自动生成的监听器方法是不带自定义返回值和参数的。同样,ANTLR生成的访问器方法也不带自定义参数。在本节中,我们将会研究在不改变事件方法签名的前提下,用它们来传递数据的机制。我们将会使用三种方法实现上一节提到的,基于LExpr表达式语法的示例计算器程序。其中。原创 2024-01-13 14:11:17 · 248 阅读 · 4 评论 -
【Antlr】Antlr 标记备选分支以获取精确的事件方法
antlr权威指南并且进行补充。为了说明过粗的事件粒度带来的问题,让我们尝试利用下列表达式语法生成的监听器构建一个简单的计算器程序。实际上,规则e产生了一个相当鸡肋的监听器方法,因为规则e的所有备选分支都会被遍历器触发为完全相同的enterE()和exitE()方法.因此,我们实现的监听器方法就不得不做这样的测试:用op词法符号和ctx的方法来判断语法分析器匹配到子树e是哪一个备选分支。其中,exitE()引用的MULT字段是由Antlr在ExprParser中生成的。原创 2024-01-12 21:00:00 · 211 阅读 · 1 评论 -
【Antlr】Antlr 使用访问器编写程序、解析properties文件
本文出自:antlr权威指南 并且进行补充。我们使用访问器机制代替监听器机制的详细步骤是:令ANTLR生成一个访问器接口,实现该接口,然后编写一个测试程序对语法分析树调用visit()方法。因此,我们完全不需要跟语法交互。当在命令行中使用“-visitor" 选项时,ANTLR自动生成了接口PropertyFileVisitor和以下默认实现类PropertyFileBaseVisitor:我们可以从上一节的监听器中拷贝exitProp 0中的代码,将它们粘贴到prop规则对应的访问器方法中。原创 2024-01-11 20:27:25 · 201 阅读 · 2 评论 -
【Antlr】Antlr 使用语法分析树监听器编写程序、Antlr 解析 Properties 格式、监听器模式
出自:Antlr权威指南 并且进行补充。构建应用逻辑和语法松男合的语言类应用程序的关键在于,令语法分析器建立一棵语法分析树,然后在遍历该树的过程中触发应用逻辑代码。我们可以使用自己熟悉的方法遍历这样的语法分析树,也可以利用ANTLR自动生成的树遍历器。在本节中,我们将会使用ANTLR内貴的ParseTreeWalker构建一个与上一节类似的、基于监听器的属性文件处理程序。让我们从一个“干净”的、识别属性文件的语法开始。该语法树可以构建如下这种结构。原创 2024-01-10 00:15:00 · 987 阅读 · 0 评论 -
【Antlr】Antlr 从内嵌动作到监听器的演进
这样的重构可以使得语法中仅仅包含方法调用,之后我们就可以通过语法分析器的子类实现任意数量的不同功能的程序,而无须修改原先的语法。为了展示重构后的语法拥有良好的复用性,让我们构建两个不同的“语言类应用程序”,先从其中一个开始:在遇到属性的时候将它们打印出来。为了展示重构后的语法拥有良好的复用性,让我们构建两个不同的〞语言类应用程序”,先从其中一个开始:在遇到属性的时候将它们打印出来。编写这个程序的过程非常简单,只需继承ANTLR自动生成的语法分析器类,然后覆盖语法中触发的一个或多个方法即可。原创 2024-01-09 02:15:00 · 822 阅读 · 0 评论