Antlr 是一款强大的语法生成器工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件,也是目前Java领域最流行的语法解析工具,Hibernate、Hive、ShardingSphere等众多框架都能看到它的影子。

        Antlr支持多种语言:Java、C、C++、Python、Javascript,同一套语法规则可以通过多种语言来实现。本系列将以Java作为描述语言来介绍antlr的安装和环境配置。

资源

        Antlr官方网址: https://www.antlr.org/

        Antlr在线编辑解析工具: http://lab.antlr.org/

        各类语言、协议、标准语法模板: https://github.com/antlr/grammars-v4/

        官方文档(中、英文): https://download.csdn.net/download/coffen2046/90035178

Jar包方式安装

        Antlr4从 4.10 版本起需要JDK11环境支持,如须在JDK8环境使用则最高只能选择 4.9.3 版本。官方提供antlr-4.x-complete的jar包(https://www.antlr.org/download.html)下载,该jar既包含编译工具、也包含运行时环境,此外还附带StringTemplate(官方自家的模板引擎)等,可以直接编译语法文件并进行语法解析。

        下载antlr-4.x-complete包到指定目录(文中示例配置路径为D:\Antlr),官方提供了两个工具类用于编译和测试规则文件,通过两个脚本文件分别封装命令如下:

antlr4.bat(用于编译词法规则、语法规则,即将语法规则转换为Java源文件)

@ECHO OFF
SET TEST_CURRENT_DIR=%CLASSPATH:.;=%
if "%TEST_CURRENT_DIR%" == "%CLASSPATH%" ( SET CLASSPATH=.;%CLASSPATH% )
@ECHO ON
java org.antlr.v4.Tool %*

grun.bat(用于测试解析规则,运行前需完成语法编译及生成Java源文件的编译)

@ECHO OFF
SET TEST_CURRENT_DIR=%CLASSPATH:.;=%
if "%TEST_CURRENT_DIR%" == "%CLASSPATH%" ( SET CLASSPATH=.;%CLASSPATH% )
@ECHO ON
java org.antlr.v4.gui.TestRig %*

注: 上述脚本需要添加antlr-4.x-complete包至系统环境变量classpath中,如果生成java源文件目录和complete包所在路径不是同一目录,也需添加到classpath中。也可以采用java -cp的方式修改上述脚本内容。

安装完成,最终的文件目录如下图所示,src目录即生成java文件的目录,两个g4文件分别是词法规则和语法规则文件,两个bat文件为脚本运行文件,test.txt为测试文件

环境部署完成,则可以通过下面的命令完成编译和测试

D:\Antlr>.\antlr4.bat .\TestLexer.g4 -o ./src
D:\Antlr>.\antlr4.bat .\TestParser.g4 -o ./src
D:\Antlr>javac .\src\*.java
D:\Antlr>.\grun.bat Test root test.txt -gui

结果展示如下图

Maven插件配置

        通过jar包的方式调试太不方便,只适合试手。实际开发工作中还是要通过IDE插件或Maven插件完成自动化编译部署,下面就介绍maven插件的配置方式。

        首先引入antlr的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    ...
	<properties>
		<java-version>1.8</java-version>
        <antlr4-version>4.9.3</antlr4-version>
	</properties>
    <dependencies>
        ...
        <dependency>
		    <groupId>org.antlr</groupId>
		    <artifactId>antlr4-runtime</artifactId>
		    <version>${antlr4-version}</version>
		</dependency>		
		<dependency>
		    <groupId>org.antlr</groupId>
		    <artifactId>antlr4</artifactId>
		    <version>${antlr4-version}</version>
		</dependency>
    </dependencies>
    ...
</project>

        配置antlr4-maven-plugin插件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    ...
	<build>
        ...
		<plugins>
			<plugin>
                <groupId>org.antlr</groupId>
                <artifactId>antlr4-maven-plugin</artifactId>
                <version>${antlr4-version}</version>
                <executions>
                    <execution>
                        <id>antlr</id>
                        <goals>
                            <goal>antlr4</goal>
                        </goals>
						<phase>none</phase>
                    </execution>
                </executions>
                <configuration>
					<arguments>
						<!-- 命令行参数 -package ${package} 定义生成java代码的包名-->
						<argument>-package</argument>
						<argument>net.coffen.router.antlr4</argument>
						<!-- 输出生成的Java源码文件位置, 这里的输出文件夹定义一定要与上面 -package 定义的包名匹配 -->
						<argument>-o</argument>
						<argument>src/main/java/net/coffen/router/antlr4</argument>
					</arguments>
                    <!-- 语法文件存放目录 --><sourceDirectory>${basedir}/src/main/resources/antlr4</sourceDirectory>
                    <!-- 是否生成Listener -->
                    <listener>true</listener>
                    <!-- 是否生成Visitor -->
                    <visitor>false</visitor>
                    <!-- 告警即视作错误, 生成失败 -->
                    <treatWarningsAsErrors>false</treatWarningsAsErrors>
                </configuration>
            </plugin>
		</plugins>
	</build>

配置完成,即可通过IDE的maven操作菜单完成编译,也可通过下面的命令行方式运行生成:

> cd test-project
> mvn org.antlr:antlr4-maven-plugin:antlr4
IDE集成Antlr插件
        IDEA

1. 插件安装及右键菜单

        

2. 插件配置

3. 测试界面

        Eclipse

插件安装时可能会因为网络原因出现报错,这里介绍安装步骤和报错解决的方法

注: 安装antlr插件时可能遇到网络报错的情况,需要在C:\Windows\System32\drivers\etc\hosts文件末尾添加一行配置。其中 xxx.xxx.xxx.xxx 代表 raw.githubusercontent.com 对应的ip地址(可通过一些IP查询网站获得)

xxx.xxx.xxx.xxx    raw.githubusercontent.com

Eclipse插件功能使用和IDEA插件相似,本文不再详述

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐