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

antlr4略解

文章目录

    • 1. antlr4是用来干什么的?
    • 2. 什么是lexer和parser?
    • 3. 使用antlr4生成某语言的lexer和parser的具体过程
    • 4. 其他

1. antlr4是用来干什么的?

是用来生成某语言lexer和parser的。
通俗点说,就是输入一个语言的规则描述文件,输出这个语言的lexer和parser。

2. 什么是lexer和parser?

编译可以分成词法分析,语法分析,语义分析等若干步骤,
以如下c++代码为例

int b;
int a=b+1;

词法分析是把源代码分成一个token序列,lexer就是负责词法分析的程序,lexer中文叫分词器或词法分析器,上述代码可能会被lexer分成如下token序列

int 'int' 
identifier 'b'
semi ';'
int 'int'
identifier 'a'
equal '='
identifier 'b' 
plus '+' 
numeric_constant '1'
semi ';'
eof ''

语法分析是把经词法分析得到的token序列,转换成一颗抽象语法树,parser就是负责语法分析的程序,parser的中文叫语法分析器或解析器,上述代码可能会被解析成如下抽象语法树

|-VarDecl 0x1cf11c82838  used b 'int'
`-VarDecl 0x1cf11c82918 a 'int' cinit`-BinaryOperator 0x1cf11c829e0  'int' '+'|-ImplicitCastExpr 0x1cf11c829c8  'int' <LValueToRValue>| `-DeclRefExpr 0x1cf11c82980  'int' lvalue Var 0x1cf11c82838 'b' 'int'`-IntegerLiteral 0x1cf11c829a0  'int' 1

3. 使用antlr4生成某语言的lexer和parser的具体过程

在下文中为了避免混淆,先澄清一些名词的含义。例如,我们使用ANTLR4工具生成了用于解析XML语言lexer和parser,而生成的lexer和parser的源代码是Python的。在这个例子中,XML语言是要解析的语言,而Python是最终生成的代码的目标语言。

下文使用术语“被解析语言”来指代需要解析的语言,它既可以是编程语言,也可以是其他类型的语言。而“目标语言”则严格指代生成的代码所采用的编程语言。ANTLR4工具支持通过编写语言规则文件来支持各种自定义的“被解析语言”。目前,ANTLR4支持十几种常见的目标语言,如C++、Java、Python等。

具体生成lexer/parser的过程如下:

  1. 安装antlr4,参考https://github.com/antlr/antlr4/blob/master/doc/getting-started.md
  2. 编写被解析语言的规则文件,规则文件的具体写法可参考https://github.com/antlr/antlr4/blob/master/doc/grammars.md,antlr4项目本身已经包含了大量写好的常见语言的规则文件,在仓库https://github.com/antlr/grammars-v4里,这样大部分常见语言都不用自己写规则文件了。
  3. 根据规则文件生成对应的lexer/parser和对应lexer/paser依赖的运行时库,参考https://github.com/antlr/antlr4/blob/master/doc/getting-started.md,其中需要注意的是选择是否生成ast对应的visitor或listener,visitor和listener都是用来遍历抽象语法树的。

4. 其他

antlr4一般是用来生成自定义语言或者比较小众的语言的语法分析器的,如果是需要解析比较常用的语言,可能用现成的lexer/parser,比使用antlr4生成的lexer/parser更合适。例如解析c++有clang,解析python有ast标准库,都比antlr4方便且强大。

相关文章:

antlr4略解

文章目录 1. antlr4是用来干什么的&#xff1f;2. 什么是lexer和parser&#xff1f;3. 使用antlr4生成某语言的lexer和parser的具体过程4. 其他 1. antlr4是用来干什么的&#xff1f; 是用来生成某语言lexer和parser的。 通俗点说&#xff0c;就是输入一个语言的规则描述文件&…...

超级好用的C++实用库之文件目录操作

&#x1f4a1; 需要该C实用库源码的大佬们&#xff0c;可扫码关注文章末尾的微信公众号二维码&#xff0c;或搜索微信公众号“希望睿智”。添加关注后&#xff0c;输入消息“超级好用的C实用库”&#xff0c;即可获得源码的下载链接。 概述 文件和目录操作是操作系统层面上的基…...

结合kimi chat的爬虫实战思路

背景 想钻研一下项目组件&#xff0c;找找之后的学习方向。不能自以为是&#xff0c;所以借着网开源项目网站上公布的项目内容看一下&#xff0c;那些是我可以努力去学习的&#xff08;入门的&#xff09;。首先需要获取相关内容&#xff0c;于是爬取整理。 任务1&#xff1a…...

UnsupportedClassVersionError异常如何解决?

下面是异常报错的详细描述 java -version java version "17.0.11" 2024-04-16 LTS Java(TM) SE Runtime Environment (build 17.0.117-LTS-207) Java HotSpot(TM) 64-Bit Server VM (build 17.0.117-LTS-207, mixed mode, sharing) 环境变量已经是jdk17&#xff0c;但…...

LeetCode热题100|动态规划Part.1|70.爬楼梯、118.杨辉三角、198.打家劫舍

70.爬楼梯 代码随想录原题&#xff0c;看这篇文章&#xff1a;C动态规划Part.1|动态规划理论基础、509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯 118.杨辉三角 题目链接&#xff1a;118.杨辉三角 一刷代码 时间复杂度和空间复杂度都造到 O ( n u m R o w s 2 ) O(num…...

python 根据网址和关键词批量下载影像

最近用到了GLASS的LAI产品&#xff0c;但这个产品的文件夹分得很细&#xff0c;我需要的影像又有8个瓦片&#xff0c;一个一个点击很麻烦&#xff0c;于是探索了批量下载的方法 一、下载1幅 import requests import re import os import requests import re# 网页URLurl &…...

爬虫-无限debug场景 解决方式

解决无限debug 场景1 1. 鼠标右键 选择 continue to here&#xff08;此处不停留&#xff09;2. 鼠标右键 选择 edite breakpoint 设置 10 保证条件不成立 这行永远不执行3.方法置空 1. 方法调用加断点2. 控制台 setInterval function name() {}4. 替换文件 5. hoo…...

[链表专题]力扣206, 203, 19

1. 力扣206 : 反转链表 (1). 题 : 图略 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。示例 1&#xff1a;输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a;输入&#xff1a;head [1,2] 输出&#x…...

秋招后端开发面试题 - MySQL基础

目录 MySQL基础前言面试题MySQL 基础篇Mysql 的基础架构&#xff1f;MySQL 的长连接和短连接长连接引起的异常重启问题&#xff1f;说一下 MySQL 执行一条查询语句的内部执行过程&#xff1f;MySQL 查询缓存的功能有何优缺点&#xff1f;MySQL 的常用引擎都有哪些&#xff1f;I…...

力扣每日一题113:路径总和||

题目 中等 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSu…...

Thinkphp5 中常见的session 操作方法

在 ThinkPHP 框架中&#xff0c;session 是用于在多个页面或请求之间存储用户信息的机制。以下是在 ThinkPHP 中进行 session 常见操作的一些示例&#xff1a; 启动 Session 在 ThinkPHP 中&#xff0c;通常不需要手动启动 Session&#xff0c;因为框架会在应用启动时自动处理…...

inBuilder 低代码平台新特性推荐 - 第十八期

今天来给大家带来的是inBuilder低代码平台特性推荐系列第十八期——表单设计器集成预约日历组件。 一、场景介绍 项目上希望用日历的形式展示某地点在一段时间内的预约记录&#xff0c;表单设计器新增支持创建日历预约视图&#xff0c;并配置预约属性。 二、运行效果 三、前…...

部署xwiki服务需要配置 hibernate.cfg.xml如何配置?

1. 定位 hibernate.cfg.xml 文件 首先&#xff0c;确保您可以在 Tomcat 的 XWiki 部署目录中找到 hibernate.cfg.xml 文件&#xff1a; cd /opt/tomcat/latest/webapps/xwiki/WEB-INF ls -l hibernate.cfg.xml如果文件存在&#xff0c;您可以继续编辑它。如果不存在&#xff…...

1376:信使(msner)

【解题思路】 每个哨所是一个顶点&#xff0c;哨所与哨所之间的通信线路为边&#xff0c;两哨所间通讯花费的时间为边的权值。记第一个哨所为顶点s&#xff0c;信息从第一个哨所传递到表示为顶点x的某哨所可能有多条路径&#xff0c;每条传送路径有一个花费的时间&…...

Hadoop3:HDFS的架构组成

一、官方文档 我这里学习的是Hadoop3.1.3版本&#xff0c;所以&#xff0c;查看的也是3.1.3版本的文档 Architecture模块最下面 二、HDFS架构介绍 HDFS架构的主要组成部分&#xff0c;是一下四个部分 1、NameNode(NN) 就是Master节点&#xff0c;它是集群管理者。 1、管…...

P2910 [USACO08OPEN] Clear And Present Danger S

Problem: P2910 [USACO08OPEN] Clear And Present Danger S 文章目录 思路解题方法复杂度Code 思路 这是一个图论问题&#xff0c;我们需要找到从一个城市到另一个城市的最短路径。我们可以使用Floyd-Warshall算法来解决这个问题。首先&#xff0c;我们需要构建一个距离矩阵&am…...

ES6 对象方面的新特性

ES6&#xff08;ECMAScript 2015&#xff09;为JavaScript语言增加了很多新特性&#xff0c;包括对象字面量属性的简写、计算属性名、方法的简写、对象的解构赋值、Object.assign()方法复制对象属性、Object.is()比较两个值等。以下是一些在ES6中经常使用的对象方法&#xff1a…...

GO语言核心30讲 进阶技术 (第一部分)

原站地址&#xff1a;Go语言核心36讲_Golang_Go语言-极客时间 一、数组和切片 1. 两者最大的不同&#xff1a;数组的长度是固定的&#xff0c;而切片的长度是可变的。 2. 可以把切片看成是对数组的一层封装&#xff0c;因为每个切片的底层数据结构中&#xff0c;一定会包含一…...

[力扣题解]225. 用队列实现栈

题目&#xff1a;225. 用队列实现栈 思路 用一个队列模拟栈&#xff1b; 假设有数字&#xff1a;1&#xff0c;2&#xff0c;3&#xff1b; pop 队列里是这样的存的&#xff1a;3&#xff0c;2&#xff0c;1&#xff1b; 作为一个栈&#xff0c;应该弹出最后进来的那一个3&…...

Leetcode—2105. 给植物浇水 II【中等】

2024每日刷题&#xff08;131&#xff09; Leetcode—2105. 给植物浇水 II 实现代码 class Solution { public:int minimumRefill(vector<int>& plants, int capacityA, int capacityB) {int size plants.size();int i 0;int j size - 1;int capA capacityA;in…...

安全治理加速金融AI收入增长

金融机构正在学习如何部署合规的AI解决方案&#xff0c;以实现更大的收入增长和市场优势。在过去十年的大部分时间里&#xff0c;金融机构主要将AI视为提高纯粹效率的机制。在那个时代&#xff0c;量化团队编写系统来发现账本差异或减少自动交易执行时间中的毫秒。只要季度资产…...

Windows 11本地Ollama大模型部署实战指南

1. Windows 11本地部署Ollama大模型的前期准备 最近在折腾本地大模型部署&#xff0c;发现Ollama这个工具确实挺适合新手入门的。相比其他复杂的部署方案&#xff0c;Ollama在Windows平台上的安装过程简单明了&#xff0c;而且支持多种主流开源大模型。不过在实际操作中&#x…...

Redis持久化:从AOF到RDB,如何实现数据不丢失?

Redis属于内存数据库&#xff0c;但为了防止宕机等导致的数据丢失&#xff0c;也有对应的数据持久化技术。持久化主要作用就是数据备份&#xff0c;即将数据存储在硬盘&#xff0c;保证数据不会因进程退出而丢失。 AOF持久化 Append Only File 类似于Mysql的binlog日志类似&…...

从温控器到无人机:PID参数整定的‘手感’秘籍,附C语言代码避坑指南

从温控器到无人机&#xff1a;PID参数整定的‘手感’秘籍与实战避坑指南 在工业自动化和智能硬件开发中&#xff0c;PID控制算法就像一位隐形的调音师&#xff0c;默默调节着系统的每一个细微变化。无论是缓慢升温的工业烘箱&#xff0c;还是高速响应的四旋翼无人机&#xff0c…...

浏览器插件:让Markdown预览效率提升300%的秘密武器

浏览器插件&#xff1a;让Markdown预览效率提升300%的秘密武器 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 作为开发者、学生或技术写作者&#xff0c;你是否经常遇到这些困扰…...

Goofys安全最佳实践:保护你的S3文件系统访问的终极指南

Goofys安全最佳实践&#xff1a;保护你的S3文件系统访问的终极指南 【免费下载链接】goofys a high-performance, POSIX-ish Amazon S3 file system written in Go 项目地址: https://gitcode.com/gh_mirrors/go/goofys 在当今云原生时代&#xff0c;安全访问云存储变得…...

如何用Win11Debloat让你的Windows系统速度提升70%:终极优化指南

如何用Win11Debloat让你的Windows系统速度提升70%&#xff1a;终极优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutt…...

Wangle客户端开发实战:从零开始构建高效网络应用

Wangle客户端开发实战&#xff1a;从零开始构建高效网络应用 【免费下载链接】wangle Wangle is a framework providing a set of common client/server abstractions for building services in a consistent, modular, and composable way. 项目地址: https://gitcode.com/g…...

RMBG-1.4开源模型解析:AI净界如何实现SOTA级Alpha通道生成

RMBG-1.4开源模型解析&#xff1a;AI净界如何实现SOTA级Alpha通道生成 你有没有遇到过这样的烦恼&#xff1f;想给产品换个背景&#xff0c;结果抠出来的图边缘全是锯齿&#xff1b;想给自己做一张透明背景的证件照&#xff0c;头发丝却和背景糊在一起&#xff1b;或者想用AI生…...

新国标GB 44263实战:如何用一颗传感器搞定交/直/脉动全波形漏电检测?

第一名背后鲜为人知的“现实”我国已经建成全球规模最大的电动汽车充电网络&#xff0c;国家能源局数据显示&#xff0c;截至2026年1月底&#xff0c;我国电动汽车充电基础设施&#xff08;枪&#xff09;总数达到2069.8万个&#xff0c;公共充电设施&#xff08;枪&#xff09…...