强大的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

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部