ANTLR4入门学习(四)
ANTLR4入门学习(四)
- 一、设计语法
- 1.语法
- 2.ANTLR核心标记
- 3.常见计算机语言模式
- 4.左右递归
- 5.识别常见的语法结构
- 5.1 匹配标识符
- 5.2 匹配数字
- 5.3 匹配字符串常量
- 5.4 匹配注释和空白字符
- 5.5 基础的语法规则
- 5.6 划定词法分析器和语法分析器的界线
一、设计语法
- 序列:一列元素,一个数组初始化语句中的值
- 选择:在多种可选方案中做出选择,例如编程语言中的不同种类的语句
- 词法符号依赖:一个词法符号需要和某处的另外一个词法符号配对,例如左右括号匹配
- 嵌套结构:一种自相似的语言结构,例如编程语言中的嵌套算数表达式或者嵌套语句块
1.语法
语法由一个为该语法命名的头部定义和一系列可以相互引用的语言规则组成;
grammar MyG;
rule1 : <<stuff>>;
rule2 : <<more stuff>>;
...
必须指明需要的语言规则,其中<<stuff>>的具体内容,以及那条规则是起始规则;
一个CSV文件就是一系列以换行符为终止的行。(a comma-separated-value[CSV]file is a sequence of rows terminated by newlines.)其中,is a左侧的单词file就是规则名,右侧的全部内容就是规则定义中的<<stuff>>。
file : <<sequence of rows terminated by newlines>>;
降低层次,描述起始规则右侧所指定的元素,通常是词法符号或者尚未定义的规则。
再降低一层,一个行就是一系列由逗号分隔的字段(a row is sequence of fields separated by commas)。一个字段就是一个数字或者字符串(a field is a number or string)。
file : <<sequence of rows terminated by newlines>>;
row : <<sequence of fields separated by commas>>
field : <<number or string>>;
2.ANTLR核心标记
| 用法 | 描述 |
|---|---|
| x | 匹配词法符号、规则引用或者子规则x |
| x y … z | 匹配一列规则元素 |
| (…|…|…) | 一个具有多个备选分支的子规则 |
| x? | 匹配x或者忽略它 |
| x* | 匹配x零次或多次 |
| x+ | 匹配x一次或多次 |
| r : … ; | 定义规则r |
| r : … | … | …; | 定义具有多个备选分支的规则r |
3.常见计算机语言模式
| 模式名 | 描述 |
|---|---|
| 序列模式 | 它是一个有限长度或者任意长度的序列,序列中的元素可以是词法符号或者子规则、序列模式的例子包括变量声明(类型后面紧跟着标识符)和整数序列,范例: x y … z // x后面跟着y , … , z ‘[’ INT+ ‘]’ // Matlab的整数向量 |
| 带终止符的序列模式 | 它是一个任意长的、可能为空的序列,该序列由一个词法符号分隔开,通常是分号或者换行符,其中的元素可以是词法符号或子规则,范例: (statement ‘;’)* //java的语句集合 (row ‘\n’)* //多行数据 |
| 带分隔符的序列模式 | 它是一个任意长的、可能为空的序列,该序列由一个词法符号分隔开,通常是逗号、分号或是句号,其中的元素可以是词法符号或子规则,范例: expr (‘,’ expr)* // 函数调用时传递的参数 (expr (‘,’ expr)* )? // 函数调用时传递的参数是可选的 ‘/’? name (‘/’ name)* //简化的目录名 stat (‘.’ stat)* //若干个SmallTalk(程序设计语言)语句 |
| 选择模式 | 它是一组备选分支的集合,这样的例子包括不同种类的类型、语句、表达式或者XML标签,范例: type : ‘int’ | ‘flloat’ ; stat : ifstat | whilestat | ‘return’ expr ‘;’ expr : ‘(’ expr ‘)’ | INT | ID ; tag : ‘<’ Name attribute* ‘>’ | ‘<’ ‘/’ Name ‘>’ ; |
| 词法符号依赖 | 一个词法符号需要和一个或者多个后续词法符号匹配,这样的例子包括配对的圆括号、花括号、方括号和尖括号,范例: ‘(’ expr ‘)’ // 嵌套表达式 ID ‘[’ expr ‘]’ // 数组索引表达式 ‘{’ stat* ‘}’ // 花括号包裹的若干个语句 ‘<’ ID (‘,’ ID)* ‘>’ //泛型声明 |
| 嵌套模式 | 它是一种自相似的语言结构,这样的例子包括表达式、Java的内部类、嵌套的代码块以及嵌套的Python函数定义,范例: expr : ‘(’ expr ‘)’ | ID ; classDef : ‘class’ ID ‘{’ (classDef | method | field) ‘}’ ; |
4.左右递归
ANTLR4 可以处理直接左递归,但是不能处理间接左递归,但最好不要使用左递归
ANTLR 由上到下 优先级依次降低
expr : expr '^' <assoc=right> expr // ^运算符是右结合的 最好写成 <assoc=right> expr '^' expr| expr '*' expr // 匹配由 * 运算符连接的子表达式| expr '+' expr // 匹配由 + 运算符连接的子表达式| INT // 匹配简单的整数因子;
但是ANTLR无法处理间接左递归
error:
expr : expo // 通过expo规则间接左递归调用expr规则| ...;
expo : expr '^' <assoc=right> expr;
尽管语义等价,但是无法将expr规则按上述分解
5.识别常见的语法结构
5.1 匹配标识符
语法伪代码中,一个基本的标识符就是一个由大小写字母组成的字符序列,可以用(…)+表示,也可以用正则表示
ID : ('A'..'Z'|'a'..'z')+ ; 匹配1个或者多个大小写字母
ID : [a-z]A-Z]+ ; 匹配1个或者多个大小写字母
ANTLR从文法规则中筛选除所有的字符串常量,并将他们和词法规则放在一起。'enum’这样的字符串常量被隐式定义为词法规则,然后放置在文法规则之后、显示定义的词法规则之前,ANTLR词法分析器解决歧义问题的方法是优先使用位置靠前的词法规则。ID规则必须定义在所有的关键字规则之后 。
5.2 匹配数字
匹配整数
INT : '0'..'9'+ ; // 匹配1个或多个数字
INT : [0-9]+ ; // 匹配1个或多个数字
匹配浮点数
一个浮点数以一列数字为开头,后面跟着一个点,然后是可选的小数部分:浮点数的另一个格式,以点为开头,后面是一列数字,使用选择模式或序列模式
FLOAT : DIGIT+ ',' DIGIT* // 匹配1.,39.,3.14159| '.' DIGIT+ //匹配 .1, .14159;
fragment
DIGIT : [0-9]; // 匹配单个数字
fragment 可以告诉ANTLR,这条规则本身不是一个语法符号,它只会被其他的词法规则使用,这意味着我们不能再文法规则中引用DIGIT
5.3 匹配字符串常量
STRING : '"' .*? '"' ; // 匹配"..."间的任意文本
.*是一个循环,匹配零个或多个字符组成的任意字符序列,可以匹配到文件结束,ANTLR通过标准正则表达式的标记(?后缀)提供了对非贪婪匹配子规则的支持,获取一些字符,直到发现匹配后续子规则的字符为止,再保证整个父规则完成匹配的前提下,非贪婪的子规则匹配数量最少的字符。
STRING : '"' (ESC|.)*? '"' ;
fragment
ESC : '\\"' | '\\\\' ; // 双字符序列 \" 和 \\
其中ANTLR语法本身需要对转义字符\进行转义,因此我们需要\来表示单个反斜杠字符
STRING规则中的循环既能通过ESC片段规则(fragment rule)来匹配转义字符序列,也能通过通配符来匹配任意单个字符。?运算符会使 (ESC|.)? 循环在看到子后续子规则,即一个未转义的双引号时终止。
5.4 匹配注释和空白字符
assign : ID (WS|COMMENT)? '=' (WS|COMMENT)? expr (WS|COMMENT)? ;
LINE_COMMENT : '//' .*? '\r'? '\n' -> skip ; // 匹配 "//" 任意字符序列 '\n'
COMMENT : '/*' .*? '*/' -> skip ; // 匹配"/*" 任意字符序列 "*/"
WS : (' '|'\t'|'\r'|'\n'])+ -> skip ; // 匹配一个或多个空白字符并将它们丢弃
WS : [ \r\t\n]+ -> skip ;
skip指令通知词法分析器将它们丢弃即可
词法分析器可以接受许多种位于-> 操作符之后的指令,skip只是其中之一。
5.5 基础的语法规则
| 词法符号类型 | 描述及范例 |
|---|---|
| 标点符号 | 处理运算符和标点符号最容易的方式就是直接在文法规则中引用它们。 call : ID ‘(’ exprList ‘)’ ; 一些开发者更愿意定义类型LP(左括号, left parcnthesis)的词法符号标签。 call : ID LP exprList RP ; LP : ‘(’ ; RP : ‘)’ ; |
| 关键字 | 关键字是保留的标识符,我们既可以直接引用它们,也可以为它们定义词法符号类型 returnStat : ‘return’ expr ‘;’ |
| 标识符 | 几乎每种语言中的标识符看上去都差不多,它们之间的差异通常在与第一个字符的可选值以及是否允许Unicode字符。 ID : ID_LETTER (ID_LETTER | DIGIT) *; // C语言的语法片段 fragment ID_LETTER : ‘a’…‘z’|‘A’…‘Z’|‘…’ ; fragment DIGIT : ‘0’…9’; |
| 数字 | 范例: INT : DIGIT+; FLOAT : DIGIT+ ‘.’ DIGIT* | ‘.’ DIGIT+; |
| 字符串 | 匹配双引号包围的字符串 STRING : ‘"’ (ESC |.)*? ‘"’ ; fragment ESC : ‘\"’ | ‘\\’ ; // 双字符序列 " 和 | |
| 注释 | 匹配并丢弃注释 LINE_COMMENT : ‘//’ .? ‘\r’? ‘\n’ -> skip ; // 匹配 “//” 任意字符序列 ‘\n’ COMMENT : '/’ .? '/’ -> skip ; // 匹配"/*" 任意字符序列 “*/” |
| 空白字符 | WS : [ \r\t\n]+ -> skip ; |
5.6 划定词法分析器和语法分析器的界线
- 在词法分析器中匹配并丢弃任何语法分析器无须知晓的东西。对于编程语言来说,要识别并丢弃的就是类似注释和空白字符的东西。
- 由词法分析器来匹配类似标识符、关键字、字符串和数字的常见词法符号。语法分析器的层级更高,所以我们不应当让它处理将数字组合成整数这样的事情。
- 将语法分析器无须区分的词法结构归为同一个词法符号类型。
- 将任何语法分析器可以以相同方式处理的实体归为一类。
- 如果语法分析器许哟把一种类型的文本拆开处理,那么词法分析器就应该将它的各组成部分作为独立的词法符号输送给语法分析器。
- 语法分析器无须区分特定的词法结构或者无须关心某个词法结构的内容时,实际上是我们编写的程序不关心它们。
例如
192.168.209.85 "GET /download/foo.html HTTP/1.0" 200
- 如果只想要统计总行数,可以忽略除换行符之外的一切字符
file : NL+ ; // 匹配换行符序列的语法分析器
STUFF : ~'\n'+ -> skip; // 除'\n'之外的字符全部丢弃
NL : '\n' ; // 将设定的换行符返回给语法分析器或者其他的调用者
- 从日志文件中提取IP地址的列表
file : row+; // 匹配日志文件中的全部行的文法规则
row : IP STRING INT NL ; // 匹配日志文件中的一行记录IP : INT '.' INT '.' INT '.' INT ; // 192.168.209.85
INT : [0-9]+ ; // 匹配IP地址中的一个字节或者HTTP的状态码
STRING : '"' .*? '"' ; // 匹配HTTP请求的首行
NL : '\n' ; // 匹配一行记录的终止符
WS : ' '-> skip ; // 忽略空格
相关文章:
ANTLR4入门学习(四)
ANTLR4入门学习(四)一、设计语法1.语法2.ANTLR核心标记3.常见计算机语言模式4.左右递归5.识别常见的语法结构5.1 匹配标识符5.2 匹配数字5.3 匹配字符串常量5.4 匹配注释和空白字符5.5 基础的语法规则5.6 划定词法分析器和语法分析器的界线一、设计语法 …...
Android okhttp3中发送websocket消息,并通过mockwebserver将一个安卓设备模拟成服务器接发消息
websocket 提供了客户端和服务端的长链接,允许客户端和服务端双向发送消息 okhttp 提供了使用websocket 相关接口议。同时为方便单元测试,又提供了mockwebserver可以把一个安卓客户端作为服务端接受消息。 websocket使用 权限 <uses-permission an…...
MySQL系统变量和自定义变量
1 系统变量1.1 查看系统变量可以使用以下命令查看 MySQL 中所有的全局变量信息。SHOW GLOBAL VARIABLES; MySQL 中的系统变量以两个“”开头。global 仅仅用于标记全局变量;session 仅仅用于标记会话变量;首先标记会话变量,如果会话变量不存在…...
基于Python来爬取某音动态壁纸,桌面更香了!
至于小伙伴们想要这个封图,我也没有。不过继续带来一波靓丽壁纸,而且是动态的,我的桌面壁纸又换了:每天换着花样欣赏一波波动态壁纸桌面立刻拥有了高颜值,简直跟刷美女短视频一样啊。对的,这些动态壁纸就是…...
[数据库]表的约束
●🧑个人主页:你帅你先说. ●📃欢迎点赞👍关注💡收藏💖 ●📖既选择了远方,便只顾风雨兼程。 ●🤟欢迎大家有问题随时私信我! ●🧐版权:本文由[你帅…...
VisualGDB 5.6R9 FOR WINDOWS
Go cross-platform with comfort VisualGDB 是 Visual Studio 的一个非常强大的扩展,它允许您调试或调试嵌入式系统。这个程序有一个非常有吸引力的用户界面,它有许多调试或调试代码的功能。VisualGDB 还有一个向导可以帮助您调试程序,为您提…...
Yolov8的多目标跟踪实现
Yolov8_tracking 2023年2月,Yolov5发展到yolov8,这世界变得真快哦。Yolov8由ultralytics公司发布,yolov6-美团,yolov7-Alexey Bochkovskiy和Chien-Yao Wang,其各有高招,对yolov5均有提升。mikel-brostrom在…...
28--Django-后端开发-drf之自定义全局异常、接口文档生成以及三大认证源码分析
一、django请求的整个生命周期 旅程: drf处于的位置:路由匹配成功,进视图类之前 1、包装了新的request 2、处理了编码(urlencoded,formdata,json) 3、三大认证 4、进了视图类(GenericAPIView+ListModelMixin) 进行了过滤和排序去模型中取数据分页序列化返回5、处理了…...
【MyBatis】动态SQL
9、动态SQL Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。 9.1、if if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行&…...
LeetCode(剑指offer) Day1
1.用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 解题过程记录:本题就是用两个栈&…...
1、MyBatis框架——JDBC代码回顾与分析、lombok插件的安装与使用
目录 一、JDBC基本操作步骤 二、JDBC代码 三、lombok插件的安装与使用 1、lombok插件的安装 2、lombok常用注解 Data Getter Setter ToString AllArgsConstructor NoArgsConstructor 3、lombok的使用 四、JDBC代码分析 一、JDBC基本操作步骤 1、导包mysql-connect…...
笔记-GPS设备定位方式
1. 背景 最近接触到的GPS设备有点多,逐渐明白大家定位的机理,也结合网上的文章《GPS、WiFi、基站、AGPS几种定位原理介绍与区别》 来做一个简单的总结。 2. 基于GPS定位 这是最基本的定位能力,它主要就是寻找卫星,利用光传播速度…...
2023秋招携程SRE算法岗面试经验分享
本专栏分享 计算机小伙伴秋招春招找工作的面试经验和面试的详情知识点 专栏首页:秋招算法类面经分享 主要分享计算机算法类在面试互联网公司时候一些真实的经验 面试code学习参考请看:...
4.9 内部类
文章目录1.内部类概述2.特点3.练习 : 内部类入门案例4.成员内部类4.1 练习 : 被private修饰4.2 练习 : 被static修饰5.局部内部类6.匿名内部类1.内部类概述 如果一个类存在的意义就是为指定的另一个类,可以把这个类放入另一个类的内部。 就是把类定义在类的内部的情…...
ncnn模型精度验证
验证ncnn模型的精度 1、进行pth模型的验证 得到ncnn模型的顺序为:.pth–>.onnx–>ncnn .pth的精度验证如下: 如进行的是二分类: model init_model(model, data_cfg, devicedevice, modeeval)###.pth转.onnx模型# #---# input_names …...
IB-PYP幼儿十大素质培养目标
作为IB候选学校,一直秉承IB教育的核心目标,贯彻在幼儿的学习生活中。IB教育之所以成为当今国际教育的领跑者,最主要的原因是IB教育是切切实实的“全人”教育,“素质”教育,拥有一套完整的教学服务体系。当我们走进IB“…...
02.13:监督学习中的分类问题
今天首先学习了监督学习中的分类问题,跑了两个代码。现在学起来感觉机器学习有很多不同的定理建立了不同的分类器,也就是所谓不同的方法。具体的数学原理我不太清楚。然后不同的应用场景有一个最优的分类器。 值得一提的应该就是终于清晰的明白了精度&am…...
leetcode刷题 | 关于二叉树的题型总结3
leetcode刷题 | 关于二叉树的题型总结3 文章目录leetcode刷题 | 关于二叉树的题型总结3题目连接递增顺序搜索树二叉搜索树中的中序后继把二叉搜索树转换为累加树二叉搜索树迭代器题目连接 897. 递增顺序搜索树 - 力扣(LeetCode) 剑指 Offer II 053. 二…...
设计模式-结构型
设计模式-结构型 结构型设计模式包含:代理模式、适配器模式、桥接模式、装饰模式、外观设计模式、享元模式、组合模式 代理模式 核心是在具体的功能类与使用者之间建立一个中介类作为代理,使用者通过代理对象对真实的功能类进行访问。 在iOS开发中&am…...
【新】华为OD机试 - 预订酒店(Python)| 运气好 会考到原题
预订酒店 题目 放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为 n 的数组 A),他的心理价位是 x 元,请帮他筛选出 k 个最接近 x 元的酒店(n>=k>0),并由低到高打印酒店的价格。 输入 第一行:n, k, x 第二行:A[0] A[1] A[2]...A[n-…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
