
ANTLR4
ANTLR4相关学习知识。
pourtheworld
DB programmer + UE4 rookie
展开
-
ANTLR4(十四) 调用在隐藏Channel里的信息
写在之前我们曾经介绍过这样一种情况:忽略空白和注释,但在必要的时候也能调用他们。我们的处理方法是:将不需要的注释和空白放到 channel HIDDEN中。那么这次,我们尝试将空白和注释放在多个Channel中。之后我们会用一个例子演示如何读取在隐藏Channel中的信息。将空白和注释放到不同的Channel中注意在最新的版本中,以下这种方法已经过时了。@lexer::members { public static final int WHITESPACE = 1; publ原创 2020-09-06 13:20:04 · 4186 阅读 · 0 评论 -
ANTLR4(十三)解决歧义性总结
写在之前之前我们已经通过两个例子尝试着解决过歧义性的问题:运算符优先性我们通过语法分析器优先匹配靠前的规则这一准则,将乘法设置在加法规则之前,来解决这个问题。但问题是,这种优先性的歧义是在语法分析树遍历时产生的,如果我们在词法分析或者语法分析过程就遇到歧义的规则呢?词法分析时的歧义在Keywords.g4中,我们设置了IF、WHILE等多个关键字。但在词法分析过程中,它们会与ID:[a-zA-z] 这种常见的标识符词法规则产生歧义。后来我们通过在ID规则的内嵌动作中多添加了一次判定,判原创 2020-09-05 16:32:55 · 1601 阅读 · 0 评论 -
ANTLR4(十二) 内嵌代码之关键字类型替换
写在之前我们在编写语言的时候常会碰到这样一个问题:在用ID:[a-zA-z]+这样的词法规则作为标识符时,类似于if while这样的关键字匹配就会发生歧义。前几篇博客中,我们已经介绍了如何在文法规则中内嵌动作。这次,我们试着只在词法规则中内嵌动作。预期效果i这样的字符会被识别成标识符,而碰到if这样的关键字,其词法符号类型会被转换成对应关键字类型。内嵌代码我们拿一个简单的关键字识别语法文件为例。语法文件BEGIN、END、IF、WHILE、THEN作为我们的关键字。grammar Ke原创 2020-09-05 14:30:06 · 1303 阅读 · 0 评论 -
ANTLR4(十一) 内嵌代码之CSV文件解析
写在之前加载CSV数据(Listener模式)原有语法文件grammar CSV;file : hdr row+ ;hdr : row ;row : field (',' field)* '\r'? '\n' ;field : TEXT | STRING | ;TEXT : ~[,"\n\r]+ ;ST原创 2020-09-05 10:48:55 · 431 阅读 · 0 评论 -
ANTLR4(十) 内嵌代码之计算器
写在之前采用访问器的计算器语法文件:grammar Expr; prog: stat+ ;stat: expr NEWLINE | ID '=' expr NEWLINE | CLEAR NEWLINE | NEWLINE ;expr: expr op=('*'|'/') expr | ex原创 2020-09-04 14:14:20 · 781 阅读 · 1 评论 -
ANTLR4(九) 修改错误信息
@[TOC](ANTLR4(九) 修改错误信息)写在之前先来回顾一下ANTLR4是如何处理并分析输入流的。语法文件一个简单的类分析语法文件。grammar Simple;prog: classDef+ ; // match one or more class definitionsclassDef : 'class' ID '{' member+ '}' // a class has one or more members {System.out.print原创 2020-09-03 14:28:56 · 2286 阅读 · 0 评论 -
ANTLR4(八) 将JSON翻译成XML
ANTLR4(八) 将JSON翻译成XML预期效果原有语法文件我的思考具体流程运行结果预期效果输入t.json:输出t.xml:原有语法文件// Derived from http://json.orggrammar JSON;json: object | array ;object : '{' pair (',' pair)* '}' | '{' '}' ;pair:原创 2020-09-02 14:04:31 · 694 阅读 · 0 评论 -
ANTLR4(七) 加载CSV数据
加载CSV数据需求初步构想语法部分应用程序部分实际实现语法部分应用程序部分需求目标:将.csv文件的第一行作为列名,将接下来的每行的信息提取出来并打印。输入t.csv :输出:初步构想我们将语法和应用程序部分解耦合。语法部分由于首行作为列名,我们需要将它与普通的行区分开。每行的元素可以是String、text、甚至是空。应用程序部分保存首行的值作为列名。创建一个保存所有行信息的List。在进入改行时,每一行建立一个map,将首行的列名与值一个一个对应起来输入。在离开该行时,将原创 2020-09-01 14:08:02 · 509 阅读 · 1 评论 -
ANTLR4(六) 返回值 传参
ANTLR4 返回值及传参的几种方式写在之前标签的Visitor语法文件自定义Visitor运行结果自定义的栈自定义Listener运行结果ParseTreeProperty自定义Listener运行结果对比写在之前我们已经熟知了ANTLR4的Listener以及Visitor模式。虽然我们用java来编写应用程序,但是我们想将语法文件和应用文件解耦合出来,因此暂时不用内嵌动作。接下来我们会介绍三种方式:带标签的Visitor模式(java自带函数栈)、自定义的栈、ANTLR4辅助数据结构Parse原创 2020-09-01 10:07:57 · 1415 阅读 · 0 评论 -
ANTLR4(五) 解析JSON
ANTLR4 解析JSON解析JSON从JSON参考手册中提取关键信息根据信息编写语法文件json文件对象键值对数组值字符串转义字符UNICODEHEX数字无符号整数指数符号空白字符通过语法分析树检验解析JSON这次我们试着用新学的语法和词法知识来解析json。从JSON参考手册中提取关键信息一个典型的json文件:我们从json的参考手册和官方语法解释得出以下:一个json文件可以是一个对象,或者是一个由若干值组成的数组。一个对象是一组无序的键值对集合;一个对象以一个{开始,并以一个}结原创 2020-08-31 11:01:00 · 1370 阅读 · 1 评论 -
ANTLR4(四) 基础设计语法
ANTLR4基础设计语法写在之前语言模式序列选择词法符号依赖嵌套处理优先级、结合性、左递归优先级结合性左递归核心语法标记总结词法结构匹配标识符匹配数字匹配字符串常量匹配注释和空格核心词法规则总结写在之前对于ANTLR的.g4文件来说,它的格式一般如下://xx.g4grammar xx文法1:文法2:文法...词法规则词法1:词法2:...注意的几点:文件名和grammar关键字后跟的语法名应该一致。文法规则和词法规则可以同时存在一个文件中,但文法以小写开头,词法以大写原创 2020-08-30 13:54:18 · 7370 阅读 · 4 评论 -
ANTLR4(三) 语义判定 词法符号特性
ANTLR4 定制嵌入式语法及三个词法符号特性定制嵌入式语法预期效果语法文件运行效果词法分析特性通过模式切换处理相同文件中的不同格式语法文件运行词法分析器重写输入流重写Listener运行结果将词法符号送入不同通道定制嵌入式语法我们可以在语法规则的定义中,加上嵌入式的动作。我们将从一个文本文件中,根据列号,取出该列每行的值。预期效果输入文件t.rows:输出:语法文件观察以下代码:我们在该语法分析器中加入了新成员:col(也就是列号)、一个自定义的RowsParser(获取输入的文件及原创 2020-08-29 14:22:10 · 2065 阅读 · 0 评论 -
ANTLR4(二) Vistor Listener
ANTLR4 Vistor Listener示例与对比Visitor Calculator预期效果语法文件访问器模式生成语法分析器重写Visitor运行结果Listener Java预期效果语法文件访问器模式生成语法分析器重写Listener运行结果Visitor 与 ListenerVisitor Calculator我们将以访问者模式做一个计算器。预期效果输入:193a=5b=6a+b*2(1+2)*3输出:193179PS:每次操作都需要换行,输入’!'可以重置标识符对应的原创 2020-08-28 20:19:26 · 5585 阅读 · 0 评论 -
ANTLR4(一) VsCode Win10 Java 安装+环境配置+官方示例
ANTLR4 VsCode Win10 Java安装及环境配置vscode上实现官方示例预期效果编写批处理文件编写.g4格式的语法文件运行ANTLR4工具测试生成的语法分析器将语法分析器与Java程序集成(VsCode)翻译程序测试安装及环境配置jdk11 win10安装及环境配置ANTLR4 win10安装及环境配置vscode上实现官方示例接下来我们会演示如何实现一个官方示例。预期效果将static short[] data={1,2,3}翻译成static string data=原创 2020-08-27 15:00:40 · 3952 阅读 · 0 评论