当前位置: 首页 > news >正文

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
  1. 如果只想要统计总行数,可以忽略除换行符之外的一切字符
file : NL+ ; // 匹配换行符序列的语法分析器
STUFF : ~'\n'+ -> skip; // 除'\n'之外的字符全部丢弃
NL : '\n' ; // 将设定的换行符返回给语法分析器或者其他的调用者
  1. 从日志文件中提取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入门学习&#xff08;四&#xff09;一、设计语法1.语法2.ANTLR核心标记3.常见计算机语言模式4.左右递归5.识别常见的语法结构5.1 匹配标识符5.2 匹配数字5.3 匹配字符串常量5.4 匹配注释和空白字符5.5 基础的语法规则5.6 划定词法分析器和语法分析器的界线一、设计语法 …...

Android okhttp3中发送websocket消息,并通过mockwebserver将一个安卓设备模拟成服务器接发消息

websocket 提供了客户端和服务端的长链接&#xff0c;允许客户端和服务端双向发送消息 okhttp 提供了使用websocket 相关接口议。同时为方便单元测试&#xff0c;又提供了mockwebserver可以把一个安卓客户端作为服务端接受消息。 websocket使用 权限 <uses-permission an…...

MySQL系统变量和自定义变量

1 系统变量1.1 查看系统变量可以使用以下命令查看 MySQL 中所有的全局变量信息。SHOW GLOBAL VARIABLES; MySQL 中的系统变量以两个“”开头。global 仅仅用于标记全局变量&#xff1b;session 仅仅用于标记会话变量&#xff1b;首先标记会话变量&#xff0c;如果会话变量不存在…...

基于Python来爬取某音动态壁纸,桌面更香了!

至于小伙伴们想要这个封图&#xff0c;我也没有。不过继续带来一波靓丽壁纸&#xff0c;而且是动态的&#xff0c;我的桌面壁纸又换了&#xff1a;每天换着花样欣赏一波波动态壁纸桌面立刻拥有了高颜值&#xff0c;简直跟刷美女短视频一样啊。对的&#xff0c;这些动态壁纸就是…...

[数据库]表的约束

●&#x1f9d1;个人主页:你帅你先说. ●&#x1f4c3;欢迎点赞&#x1f44d;关注&#x1f4a1;收藏&#x1f496; ●&#x1f4d6;既选择了远方&#xff0c;便只顾风雨兼程。 ●&#x1f91f;欢迎大家有问题随时私信我&#xff01; ●&#x1f9d0;版权&#xff1a;本文由[你帅…...

VisualGDB 5.6R9 FOR WINDOWS

Go cross-platform with comfort VisualGDB 是 Visual Studio 的一个非常强大的扩展&#xff0c;它允许您调试或调试嵌入式系统。这个程序有一个非常有吸引力的用户界面&#xff0c;它有许多调试或调试代码的功能。VisualGDB 还有一个向导可以帮助您调试程序&#xff0c;为您提…...

Yolov8的多目标跟踪实现

Yolov8_tracking 2023年2月&#xff0c;Yolov5发展到yolov8&#xff0c;这世界变得真快哦。Yolov8由ultralytics公司发布&#xff0c;yolov6-美团&#xff0c;yolov7-Alexey Bochkovskiy和Chien-Yao Wang&#xff0c;其各有高招&#xff0c;对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语句的功能&#xff0c;它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。 9.1、if if标签可通过test属性的表达式进行判断&#xff0c;若表达式的结果为true&#xff0c;则标签中的内容会执行&…...

LeetCode(剑指offer) Day1

1.用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 解题过程记录&#xff1a;本题就是用两个栈&…...

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设备有点多&#xff0c;逐渐明白大家定位的机理&#xff0c;也结合网上的文章《GPS、WiFi、基站、AGPS几种定位原理介绍与区别》 来做一个简单的总结。 2. 基于GPS定位 这是最基本的定位能力&#xff0c;它主要就是寻找卫星&#xff0c;利用光传播速度…...

2023秋招携程SRE算法岗面试经验分享

本专栏分享 计算机小伙伴秋招春招找工作的面试经验和面试的详情知识点 专栏首页:秋招算法类面经分享 主要分享计算机算法类在面试互联网公司时候一些真实的经验 面试code学习参考请看:...

4.9 内部类

文章目录1.内部类概述2.特点3.练习 : 内部类入门案例4.成员内部类4.1 练习 : 被private修饰4.2 练习 : 被static修饰5.局部内部类6.匿名内部类1.内部类概述 如果一个类存在的意义就是为指定的另一个类&#xff0c;可以把这个类放入另一个类的内部。 就是把类定义在类的内部的情…...

ncnn模型精度验证

验证ncnn模型的精度 1、进行pth模型的验证 得到ncnn模型的顺序为&#xff1a;.pth–>.onnx–>ncnn .pth的精度验证如下&#xff1a; 如进行的是二分类&#xff1a; model init_model(model, data_cfg, devicedevice, modeeval)###.pth转.onnx模型# #---# input_names …...

IB-PYP幼儿十大素质培养目标

作为IB候选学校&#xff0c;一直秉承IB教育的核心目标&#xff0c;贯彻在幼儿的学习生活中。IB教育之所以成为当今国际教育的领跑者&#xff0c;最主要的原因是IB教育是切切实实的“全人”教育&#xff0c;“素质”教育&#xff0c;拥有一套完整的教学服务体系。当我们走进IB“…...

02.13:监督学习中的分类问题

今天首先学习了监督学习中的分类问题&#xff0c;跑了两个代码。现在学起来感觉机器学习有很多不同的定理建立了不同的分类器&#xff0c;也就是所谓不同的方法。具体的数学原理我不太清楚。然后不同的应用场景有一个最优的分类器。 值得一提的应该就是终于清晰的明白了精度&am…...

leetcode刷题 | 关于二叉树的题型总结3

leetcode刷题 | 关于二叉树的题型总结3 文章目录leetcode刷题 | 关于二叉树的题型总结3题目连接递增顺序搜索树二叉搜索树中的中序后继把二叉搜索树转换为累加树二叉搜索树迭代器题目连接 897. 递增顺序搜索树 - 力扣&#xff08;LeetCode&#xff09; 剑指 Offer II 053. 二…...

设计模式-结构型

设计模式-结构型 结构型设计模式包含&#xff1a;代理模式、适配器模式、桥接模式、装饰模式、外观设计模式、享元模式、组合模式 代理模式 核心是在具体的功能类与使用者之间建立一个中介类作为代理&#xff0c;使用者通过代理对象对真实的功能类进行访问。 在iOS开发中&am…...

【新】华为OD机试 - 预订酒店(Python)| 运气好 会考到原题

预订酒店 题目 放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为 n 的数组 A),他的心理价位是 x 元,请帮他筛选出 k 个最接近 x 元的酒店(n>=k>0),并由低到高打印酒店的价格。 输入 第一行:n, k, x 第二行:A[0] A[1] A[2]...A[n-…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...