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