强大的ANTLR4(1)

以前对于《编译原理》这门课有一种恐惧,现在强大的工具越来越多,有些原理并不一定要非常清楚,也是可以设计一种编程语言的,那就是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

申龙斌

撸代码来深夜,来杯咖啡钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值