强大的ANTLR4(2)

news/2024/5/4 4:33:53/文章来源:https://blog.csdn.net/slofslb/article/details/128490221

每次在命令行里输入文本有点麻烦,可以将hello slb保存于hello.txt文本文件中,然后运行命令:

antlr4-parse Hello.g4 r -tokens hello.txt

出现如下内容:

[@0,0:4='hello',<'hello'>,1:0]
[@1,6:8='slb',<ID>,1:6]
[@2,9:8='<EOF>',<EOF>,1:9]

输出的是词法分析结果。几个术语:
token 词法符号
tokenizing 词法符号化
lexer 词法分析器
lexical analysis 词法分析

[@0,0:4='hello',<'hello'>,1:0]表示:
第0个词法符号,是'hello',从第0个字符到第4个字符,位于输入文本的第1行的第0个字符开始。[@1,6:8='slb',<ID>,1:6]  表示:
第1个词法符号,是'slb',从第6个字符到第8个字符,类型是<ID>,位于输入文本的第1行的第6个字符开始。

识别一门语言,需要经过二个阶段,第一个阶段就是词法分析,第二个阶段是语法分析,生成一棵语法分析树。
在这里插入图片描述

下面是一个数组初始化的语法规则:

// file name: ArrayInit.g4
grammar ArrayInit;init  : '{' value (',' value)* '}' ;  // 必须匹配至少一个valuevalue : init| INT;INT :   [0-9]+ ;             // 整数WS  :   [ \t\r\n]+ -> skip ; 

运行下面的命令行,生成几个文件:

antlr4 -Dlanguage=Python3 ArrayInit.g4

1)ArrayInitParser.py
语法分析器类,每一条规则都对应一个方法,还有一些辅助代码。

2)ArrayInitLexer.py
词法分析器类

3)ArrayInitLexer.tokens
每个词法符号对应于一个数字形式的类型。

4)ArrayInitListener.py
在遍历语法分析树的时候,遍历器能够触发一系列“事件”,可以称为“回调函数”,通知我们提供的监听器对象。

试着解析一下所有的词法符号。

pygrun ArrayInit init --tokens
{99, 3, 451}
^Z
[@0,0:0='{',<1>,1:0]
[@1,1:2='99',<4>,1:1]
[@2,3:3=',',<2>,1:3]
[@3,5:5='3',<4>,1:5]
[@4,6:6=',',<2>,1:6]
[@5,8:10='451',<4>,1:8]
[@6,11:11='}',<3>,1:11]
[@7,13:12='<EOF>',<-1>,2:0]

打印语法分析树:

pygrun ArrayInit init --tree
{99, 3, 451}
^Z
(init {(value 99) ,(value 3) ,(value 451) })

用antlr4-parse也是类似的:

antlr4-parse ArrayInit.g4 init -tree
{99, 3, 451}
^Z
(init:1 { (value:2 99) , (value:2 3) , (value:2 451) })

它还支持-gui的命令行参数。
在这里插入图片描述
可以生成更复杂的嵌套数组的表示:

antlr4-parse ArrayInit.g4 init -gui
{1, {2, 3}, 4}
^Z

在这里插入图片描述

antlr4生成了一些python源代码,但要让python环境里能够解释它们,还需要安装一个东西:

pip install antlr4-python3-runtime

前面生成了一些类,但没有主程序,下面的链接里有书中相配套的Python源代码。
https://github.com/jszheng/py3antlr4book

我稍微修改了一下:

import sys
from antlr4 import *
from ArrayInitLexer import ArrayInitLexer
from ArrayInitParser import ArrayInitParseristream = FileStream('input.txt')
lexer = ArrayInitLexer(istream)
stream = CommonTokenStream(lexer)
parser = ArrayInitParser(stream)
tree = parser.init()
print(tree.toStringTree(recog=parser))

现在,使用纯Python实现,我们也可以打印刚才的语法解析树了。

一个简单的翻译器

下面需要构造一个Listener来实现数字的翻译任务。
在这里插入图片描述

只需实现一个Listener,实现enter/exit方法,就可以实现轻松实现这种转换。

from ArrayInitListener import ArrayInitListenerclass RewriteListener(ArrayInitListener):def enterInit(self, ctx):print('"', end='')def exitInit(self, ctx):print('"', end='')def enterValue(self, ctx):passdef exitValue(self, ctx):v = int(ctx.INT().getText())print(f'\\u{v:04x}', end='')

主程序也稍微增加了几行语句:

import sys
from antlr4 import *
from ArrayInitLexer import ArrayInitLexer
from ArrayInitParser import ArrayInitParser
from rewriter import RewriteListeneristream = FileStream("input.txt")
lexer = ArrayInitLexer(istream)
stream = CommonTokenStream(lexer)
parser = ArrayInitParser(stream)
tree = parser.init()
print(tree.toStringTree(recog=parser))walker = ParseTreeWalker()
walker.walk(RewriteListener(), tree)
print()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_241666.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双脚在路上,钢笔在手里,想法在脑中,2023年CSDN将在心头

☔️&#xff08;一&#xff09;行走过的道路 一年的时间说长不长&#xff0c;说短不短&#xff0c;所渡过时光的长短在于你是否留意你曾走过的路。 &#x1f434;① 记得2022年初我所许下的flag&#xff0c;是要在CSDN平台上运用今年一年的时间撰写超50篇的技术文章&#xff0…

智能家居创意DIY之智能灯泡

一、什么是智能灯 传统的灯泡是通过手动打开和关闭开关来工作。有时&#xff0c;它们可以通过声控、触控、红外等方式进行控制&#xff0c;或者带有调光开关&#xff0c;让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块&#xff0c;可与手机、家庭智能助手、或其他智能…

语音转换之CycleGan-VC2:原理与实战

非平行语音转换CycleGAN 之前学习了传统统计学习里的经典的语音转换模型GMM。随着深度学习的发展&#xff0c;出现了更好的语音转换方法&#xff0c;今天学习较为经典的CycleGan。 平行语音转换一般流程 典型代表就是基于GMM的语音转换。平行数据就是说源语音和目标语音一一…

【 Tomcat服务器】

文章目录二、Web服务器2.1 概念2.1.1 什么是Web2.1.2 什么是Web服务器2.2 常见Web服务器2.3 Tomcat服务器2.3.1 Tomcat的下载2.3.2 Tomcat的安装2.3.3 Tomcat的目录结构2.3.4 Tomcat的启动2.3.5 Tomcat的停止运行所需jar包2.3.5 Tomcat的停止2.3.6 修改Tomcat端口号2.3.7 项目部…

美容门店信息化管理系统该如何搭建?不妨参考一下百数

随着人们的生活水平越来越高&#xff0c;人们在解决了温饱问题之后有了更多的追求。其中美容正在成为不少人新的必做项目&#xff0c; 迎合了人们对于爱美的需求。目前我国美容机构市场规模已超过4500亿元&#xff0c;行业从业人员超过3000万。据国家工商联统计数字显示&#x…

宝藏又小众的东方行走rpg制作大师素材网站分享

看到大家都在问东方行走rpg制作大师素材&#xff0c;既要免费又要质量好&#xff0c;数量还要多&#xff0c;小编好不容易挖到了宝藏素材网站哦&#xff0c;资源优质数量庞大&#xff0c;使用体验也很好&#xff0c;要是需要的话&#xff0c;赶紧看一看&#xff0c;小编会给大家…

Redis实现全局唯一id,实现优惠卷秒杀的下单功能

Redis实现全局唯一id public class RedisIdWorker {private StringRedisTemplate stringRedisTemplate;public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate stringRedisTemplate;}//开始时间戳private static final long BEGIN_TIMEST…

怎么调图片分辨率?怎么改图片分辨率?

许多考生在提交报名证件照片的时候&#xff0c;都因为图片分辨率不符合规定导致上传失败&#xff0c;所以今天小编就来告诉大家如何调整图片分辨率&#xff0c;其实只要通过专业的图片修改分辨率工具就可以轻松解决。这里推荐一款在线修改分辨率的软件&#xff0c;不用下载即可…

Java重点源码回顾——HashMap1.7

1. 概述 public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, SerializableHashMap在我们的日常使用中非常多&#xff0c;所以今天来阅读下它的源码&#xff0c;了解它具体的设计思想&#xff0c;能够帮助我们扩宽视野。 H…

SpringSecurity(二十四)--OAuth2:使用JWT和加密签名(下)非对称密钥加密

一、前言 由于上文对称密钥涉及到的内容比较多&#xff0c;所以这一节的非对称密钥加密拆开成这一节单独讲解。 所以大家尽量先阅读完上一章的内容后再浏览这一章内容会更好。 二、使用通过JWT和非对称密钥签名的令牌 本节将实现OAuth2身份验证的一个示例&#xff0c;其中授…

用户手册编写的终极指南

用户手册对于寻求了解产品和流程的用户来说是非常重要的。有时&#xff0c;它们甚至是一个公司向客户销售其产品的法律要求。 客户往往会在联系你的客户支持团队之前查阅你的用户手册&#xff0c;所以你的手册有可能为你节省支持成本。 在你的用户手册上投入大量时间和精力是…

数据结构课设:迷宫问题

文章目录前言一、概要设计1、基本信息2、功能模块图3、功能描述4、调用关系图5、结果演示① 创建迷宫② 求解③ 清除多余路径二、完整代码前言 最近刚好在写自己的课设&#xff0c;匆匆忙忙写出来的课设系统&#xff0c;仍有不足&#xff0c;拿出来和大家分享一下&#xff0c;…

【HTML5】复习(二)

HTML5复习二1.代码一2.代码二3.CSS的引入方式4.选择器5.form表单的一些属性6.内联7. 音频视频8. 滑块、搜索、数字、URL9. 表单补充1.代码一 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head>&…

如何在匿名上位机中显示自定义数据波形

匿名上位机相信很多人都用过&#xff0c;以前在调飞控的时候使用过&#xff0c;可以很直观的显示数据的波形&#xff0c;比如飞机姿态等。 最近在调试foc。很多数据在调试过程中&#xff0c;仅仅使用串口打印出来显示是很不直观的&#xff0c;比如正弦波&#xff0c;经典的马鞍…

word文件损坏打不开如何修复?文件丢失怎么办?

我们日常办公中&#xff0c;经常用到Word文档。但是有时会遇到word文件损坏、无法打开的情况。这时该怎么办&#xff1f;接着往下看&#xff0c;小编在这里就给大家带来Word文件修复的方法&#xff0c;以及Word文件丢失如何恢复的方法&#xff01; 一、Word文件损坏怎么办 部分…

Mathorcup数学建模竞赛第五届-【妈妈杯】D题:图像去噪中几类稀疏变换的矩阵表示(附一等奖获奖论文和matlab代码实现)

赛题描述 假设一幅二维灰度图像 X 受到加性噪声的干扰:Y=X+N ,Y 为观察到的噪声图像, N 为噪声。通过对于图像 Y 进行稀疏表示可以达到去除噪声的目的。任务: 2. 利用 Cameraman 图像中的一个小图像块(见图 1)进行验证。 3. 分析稀疏系数矩阵,比较四种方法的硬阈值稀…

kali安装cobaltstrike详细教程

下载cobaltstrike-linux版本,此下载链接提供4.3,4.4,4.5三个版本https://download.csdn.net/download/weixin_59679023/87354658 xshell上传至kali,解压 unzip cobaltstrike 进入cobaltstrike目录,ls查看如下 ls 给cs的服务端teamserver和客户端start.sh执行权限 chmod …

Java中常见的文件操作

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 操作文件 File类 属性 构造方法 常见方法 重要方法的操作演示 文件内容的读写 FileInputStream OutputStream 按照字符读入 按照字符写入…

指南解读:急性心力衰竭中国急诊管理指南(2022)

心力衰竭&#xff08;heart failure&#xff0c;HF 简称心衰&#xff09;是由于心脏结构和 / 或功能异常导致心室充盈和/或射血能力受损的一组临床综合征&#xff0c;其病理生理学特征为肺淤血和/或体循环淤血、伴或不伴有组织器官低灌注&#xff0c;主要临床表现为呼吸困难、乏…

ETL数据清洗

大多数据仓库的数据架构可以概括为&#xff1a; 数据源-->ODS(操作型数据存储)-->DW-->DM(data mart) ETL贯穿其各个环节。 ​一、数据抽取&#xff1a; 可以理解为是把源数据的数据抽取到ODS或者DW中。 1. 源数据类型&#xff1a; 关系型数据库&#xff0c;如Or…