强大的ANTLR4(1)

news2024/10/3 2:23:03

以前对于《编译原理》这门课有一种恐惧,现在强大的工具越来越多,有些原理并不一定要非常清楚,也是可以设计一种编程语言的,那就是ANTLR4。

Antlr4(全名:ANother Tool for Language Recognition) 是一款强大的语法分析器生成工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。ANTLR是用 Java 语言编写,作者是旧金山大学的 Terence Parr 博士,早在1989 年,他就开始创作ANTLR。

经典的教程就是Terence Parr写的《The Definitive ANTLR4 Reference》,中文版书名为《ANTLR权威指南》,机械工业出版社在2017年出版。
在这里插入图片描述

安装ANTLR

如果你熟悉JAVA,那么安装ANTLR将非常容易。不过,ANTLR已经做得异常强大,即使不会JAVA,安装它也是非常方便,这里我将在Python环境下试验各种ANTLR功能。

首先安装antlr4-tools:

pip install antlr4-tools

系统会安装antlr4.exe程序到Python环境下,然后运行antlr4.exe,系统会自动安装所需的JAVA运行环境(JRE), 以及需要的jar文件(antlr4-4.11.1-complete.jar)。

再次运行antlr4,如果看到下面内容,说明环境已经安装就绪了。

C:\Users\shenlb>antlr4
ANTLR Parser Generator  Version 4.11.1
 -o ___              specify output directory where all output is generated
 -lib ___            specify location of grammars, tokens files
 -atn                generate rule augmented transition network diagrams
 -encoding ___       specify grammar file encoding; e.g., euc-jp
 -message-format ___ specify output style for messages in antlr, gnu, vs2005
 -long-messages      show exception details when available for errors and warnings
 -listener           generate parse tree listener (default)
 -no-listener        don't generate parse tree listener
 -visitor            generate parse tree visitor
 -no-visitor         don't generate parse tree visitor (default)
 -package ___        specify a package/namespace for the generated code
 -depend             generate file dependencies
 -D<option>=value    set/override a grammar-level option
 -Werror             treat warnings as errors
 -XdbgST             launch StringTemplate visualizer on generated code
 -XdbgSTWait         wait for STViz to close before continuing
 -Xforce-atn         use the ATN simulator for all predictions
 -Xlog               dump lots of logging info to antlr-timestamp.log
 -Xexact-output-dir  all output goes into -o dir regardless of paths/package

ANTLR的Hello World

使用文本编辑器写4行文本,保存到Hello.g4文件中。

grammar Hello;
r  : 'hello' ID ;
ID : [a-z]+ ;
WS : [ \t\r\n]+ -> skip ; // 忽略空格、制表符和回车换行符

运行下面的命令行:

antlr4 -Dlanguage=Python3 Hello.g4

系统会生成几个python程序和相关文件:

2022/12/29  21:43               249 Hello.interp
2022/12/29  21:43                31 Hello.tokens
2022/12/29  21:43               990 HelloLexer.interp
2022/12/29  21:43             1,730 HelloLexer.py
2022/12/29  21:43                31 HelloLexer.tokens
2022/12/29  21:43               583 HelloListener.py
2022/12/29  21:43             2,451 HelloParser.py

现在看不懂程序也没关系,ANTLR非常强大,默认生成的是JAVA代码,还可以生成很多其它语言的代码。

下面运行另外一个命令行:

antlr4-parse Hello.g4 r -gui

继续输入下面2行内容:

hello slb
^Z

本文在Windows环境里试验,第二行里的^Z表示组合键CTRL+Z,后面按一下回车键,这时会出现一个窗口界面。
在这里插入图片描述
下面开始看源代码(有点像正则表达式,或者BNF范式):

grammar Hello;    // 定义一个名叫Hello的语法规则
r  : 'hello' ID ; // 两个单撇里的是字符串,一个整体,ID在下一行定义
ID : [a-z]+ ;     // ID表示1个以上的小写字母
WS : [ \t\r\n]+ -> skip ; // 忽略空格、制表符和回车换行符

根据这个规则定义,我们输入下面这些文本都是可以识别的(必须先出现全部小写的hello,后面跟任意多的空白符,再出现一些小写字母):

hello slb
hello     shenlb
hello world

但下面的文本会报错:

Hello slb
hello ShenLB
helloslb

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis集群系列六 —— 分片集群搭建

Redis 常用集群中&#xff0c;常用的几种集群方案有&#xff1a;主从集群、哨兵集群、分片集群&#xff0c;不同的集群对应着不同的场景&#xff0c;并且各种集群也都有不同的优劣&#xff0c;本篇将以 redis 分片集群为切入点。 主从和哨兵虽然解决了高可用、高并发读的问题&…

spring之IoC注解(二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、Spring注解的使用1、加入aop的依赖2、在配置文件中添加context命名空间3、在配置文件中指定扫描的包4、在Bean类上使用注解二、Bean的选择性实例化1、需求2、…

二十三种设计模式--系列篇(一)

一、软件设计模式的产生背景 “设计模式”最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977年&#xff0c;美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大&#xff08;Christopher Alexander&#xff09;在他的著作《…

(五)devops持续集成开发——jenkins发布一个maven流水线项目

前言 本节内容使用jenkins的maven流水线组件发布一个springboot项目&#xff0c;实现自动化部署一个后端项目。在开始流水化部署前我们需要准备好一个git项目&#xff0c;并在jenkins所在的服务器安装好git客户端便于源码的拉取。并且需要安装一个ssh插件&#xff0c;将我们的…

C++学习:多态与运算符(Day.7~)

总结让人明白。 表明覆盖意图的限定符 override 如图&#xff1a; 说明&#xff1a;1.使用关键字const后&#xff0c;由于函数特征不同&#xff0c;派生类不会再隐藏基类方法 2.想要覆盖基类方法可使用关键字override&#xff0c;此关键字会强制覆盖基类方法&#xff0c;若…

微信功能,你知道多少

用了微信很多年&#xff0c;选择才发现微信收藏的正确打开方式&#xff01;感觉之前白用了那么久微信收藏&#xff0c;只用来保存消息实在是太可惜了&#xff0c;原来它还有那么多实用功能&#xff01;协助日常安排如果每天需要做的事情比较多&#xff0c;可以在这里记录日常工…

谷粒商城之高级篇知识补充

谷粒商城高级篇之知识补充 前言 本篇主要是完成谷粒商城高级篇开发时&#xff0c;我们需要了解并学习一部分补充的知识&#xff0c;才能更好的完成商城业务。 以后我们将商城任务和额外知识分开来编写&#xff0c;方便商城业务的连贯性。 下面是本篇文章各个章节对应的相应…

Apollo星火计划学习笔记——Apollo速度规划算法原理与实践

文章目录1. 速度规划算法总体介绍1.2 不同场景下的ST图1.2.1 主车向前匀速行驶1.2.2 主车先向前匀速行驶&#xff0c;后停车1.2.3 主车跟随前车行驶1.2.4 主车跟随前车刹停1.2.5 障碍车在主车后方跟行1.3 速度规划算法整体流程1.3.1 Task&#xff1a; SPEED_BOUNDS_PRIORI_DECI…

数据结构-堆

1、什么是堆 堆是一种满足以下条件的树&#xff1a;堆中的每一个节点值都大于等于&#xff08;或小于等于&#xff09;子树中所有节点的值。 2、堆的用途 当我们只关心所有数据中的最大值或者最小值&#xff0c;存在多次获取最大值或者最小值&#xff0c;多次插入或删除数据时&…

ArrayList与顺序表(一)

目录 1.线性表 2.顺序表 2.1接口的实现 3.ArrayList的简介 4.ArrayList使用 4.1ArrayList的构造 4.2ArrayList常见的操作 4.3ArrayList的遍历 4.4ArrayList的扩容机制 5.模拟实现一个ArrayList 1.线性表 线性表&#xff1a;是n个具有相同特性的数据元素的有限序列。线性…

[思考进阶]04 优秀的人,都在使用“微习惯”

除了要提升自己的技术能力&#xff0c;思维的学习和成长也非常非常重要&#xff0c;特推出此[思考进阶]系列&#xff0c;进行刻意练习&#xff0c;从而提升自己的认知。 我有个微信群&#xff0c;人很少&#xff0c;都是兄弟&#xff0c;每天打开电脑的时候&#xff0c;我都会有…

朴素贝叶斯分类的python的实现

文章目录介绍GaussianNB()参数介绍实例BernoulliNB()参数介绍实例MultinomialNB()参数介绍实例作者&#xff1a;王乐介绍 sklearn 是 scikit–learn 的简称,是一个基于 Python 的第三方模块。 sklearn 库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,…

Java 并发编程解析 | 如何正确理解Java领域中的并发锁,我们应该具体掌握到什么程度?

写在开头 对于Java领域中的锁&#xff0c;其实从接触Java至今&#xff0c;我相信每一位Java Developer都会有这样的一个感觉&#xff1f;不论是Java对锁的实现还是应用&#xff0c;真的是一种“群英荟萃”&#xff0c;而且每一种锁都有点各有各的驴&#xff0c;各有各的本&…

#P13787. [NOIP2021] 报数

目录 一&#xff0c;题目 二&#xff0c;题意分析 三&#xff0c;做法 1.直接模拟题意 2&#xff0c;用筛法来解 3&#xff0c;正解(加上记忆化) 一&#xff0c;题目 二&#xff0c;题意分析 题目意思是说:每次输入一个数,然后先判断这个数是否为某一个十进制中包含7的数…

Redis 为什么这么快?

1.基于内存实现 Redis 是基于内存的数据库&#xff0c;跟磁盘数据库相比&#xff0c;完全吊打磁盘的速度。 2.高效的数据结构 Redis 一共有 5 种数据类型&#xff0c;String、List、Hash、Set、SortedSet。 不同的数据类型底层使用了一种或者多种数据结构来支撑&#xff0c;目的…

如何选择适合自己的进销存系统软件?

选择一款合适的进销存软件&#xff0c;可以有效解决企业生产经营中业务管理、分销管理、存货管理、营销计划的执行和监控、统计信息的收集等方面的业务问题。 进销存软件一直是一个热门话题&#xff0c;别急&#xff0c;我这就来给你介绍。 一、进销存管理软件 这里我要推荐…

计算机系统概述

计算机系统概述一、操作系统的概念1、定义2、功能和目标二 、操作系统特征1、并发性2、共享性3、虚拟性4、异步性三、操作系统的发展1、手工操作阶段2、批处理阶段——单道批处理系统2、批处理阶段——多道批处理系统3、实时操作系统四、运行机制和体系结构1、运行机制①指令②…

Gitea 的邮件通知

有这样的一个需求&#xff0c;当仓库中被推送或者更新代码的时候&#xff0c;希望在邮件中收到邮件通知。 Gitea 是可以实现这个功能的&#xff0c;但是在默认情况下这个功能是关闭的。 修改配置文件 根据 Gitea 的安装不同&#xff0c;我们的配置文件在&#xff1a;vi /etc…

【正点原子FPGA连载】第六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第六章Petalinux…

【CS硕士三年级BetterBench】2022年终总结(脚踏实地,仰望星空)

2022年终总结 回忆录 2022年焦虑和快乐是这一年中最大的两种情绪了。焦虑主要是因为心里的三块石头&#xff0c;从年初就开始悬着。第一块石头&#xff0c;科研论文录用&#xff0c;第二个石头&#xff0c;拿到国奖&#xff0c;第三个石头是拿到满意的offer。目前只剩下最后一…