2. mac上的Antlr4环境搭建

1. 序言

  • 配置目标语言为Java的Antlr4环境,有以下三种方法,根据自己的需求,任选其一即可:

    • 安装complete jar,则可以通过命令行编译语法文件(.g4文件),以及测试词法或语法规则(antlr4grun命令)
    • 直接使用IDEA提供的Antlr v4插件,可以编译语法文件编译,并提供可测试语法规则的ANTLR Preview
    • 使用org.antlr:antlr4-maven-plugin实现语法文件的编译
  • 编译生成的Java代码,将自动引用org.antlr.v4.runtime包,需要pom.xml文件中添加org.antlr:antlr4-runtime,才能成功编译所有模块

    <dependency>
        <groupId>org.antlr</groupId>
        <artifactId>antlr4-runtime</artifactId>
        <version>${antlr.version}</version>
    </dependency>
    

2. 安装complete jar

2.1 安装complete jar

  • 本人的JDK版本为1.8,需要生成的为了避免出现出现如下问题,自己选择的是antlr-4.8-complete.jar,而非最新的complete jar

    Execute has been compiled by a more recent version of the Java Runtime (class file version 55.0), 
    this version of the Java Runtime only recognizes class file versions up to 52.0
    
  • 注意: complete jar中包含Antlr Tool以及Java runtime

    • Antlr Tool负责将.g4文件编译为指定语言的代码,例如Java语言
    • Java语言的parser或lexer的编译、执行,则需要依靠Java runtime,对应的maven依赖是org.antlr:antlr4-runtime
  • antlr4历史版本下载地址:website-antlr4/download/

  • 将下载好的antlr-4.8-complete.jar放到指定目录,自己是/Users/xxx/antlr目录

  • 由于没有root权限,只能修改当前用户的~/.bash_profile文件,添加如下内容:

    # config antlr4
    export CLASSPATH=".:/Users/xxx/antlr/antlr-4.8-complete.jar:$CLASSPATH"
    
    alias antlr4='java -jar /Users/xxx/antlr/antlr-4.8-complete.jar'
    
    alias grun='java org.antlr.v4.gui.TestRig'
    
  • 使用source ~/.bash_profile使其生效

  • 执行antlr4grun命令,验证配置是否生效

2.2 使用antlr4命令生成Java代码

  • 创建Hello.g4文件,内容如下:

    grammar Hello;
    
    r: 'hello' NAME;
    NAME: [a-zA-Z]+;
    WS: [ \t\r\n]+ -> skip;
    
  • 使用antlr4命令生成Java代码

    • -package:指定Java代码中的package
    • -visitor:表示生成visitor代码,默认是不生成的
    • -o:指定Java代码的输出目录,包名应该与输出目录一致
    • -Dlanguage,指定语法文件编译后的目标语言,可以设置很多不同的语言,如-Dlanguage=Python3
    antlr4 Hello.g4 -package com.sunrise.hello -visitor -o ../java/com/sunrise/hello -Dlanguage=Java
    
  • antrl4命令具体有哪些option可以查看官网ANTLR Tool Command Line Options

  • 注意: 如果通过-package com.sunrise.hello指定了package,则不需要在.g4文件中通过@header指定package信息

    // 通过@header指定package信息的antlr4语法示例
    grammar Hello;
    
    @header {
    package com.sunrise.hello;
    }
    
    
    r: 'hello' NAME;
    
    NAME: [a-zA-Z]+;
    WS: [ \t\r\n]+ -> skip;
    

2.3 grun命令测试lexer rule

  • mac中测试parser rule,除了EOF使用ctrl + D外,其他与windows相同。这里将介绍如何使用grun命令测试lexer rule(词法解析规则)

  • 在Hello.g4的示例文件中,ID就是一个lexer rule。

  • 根据grun命令的提示,如果需要测试lexer grammer,则直接将startRuleName写成tokens

  • 因此,测试ID规则的grun命令如下:

    grun Hello tokens -tokens
    
  • 使用grun测试ID规则,输入多个字符串,解析出的token结果如下

3. IDEA中的Antlr插件

3.1 安装插件

  • 在IDEA中选择Preferences ... → \rightarrow Plugins → \rightarrow Marketplace 中,输入antlr4,安装出现的ANTLR v4插件
  • 安装完成后,按照提示重启IDEA,插件便可生效
  • 目前,系统自动帮忙的是1.19.3-3版本的插件,对应的Antlr版本为4.11.1,与上一小节提到的Antlr Tools版本是不一致的

3.2 使用ANTLR Preview测试语法规则

  • 新建maven项目,在resources中,创建Hello.g4文件,内容如上
  • 这时,可以选中r这条parser rule,开启 ANTLR Preview已验证规则的正确性
  • 本人做了如下验证,从parse tree来看,该rule书写正确

3.3 使用插件生成Java代码

  • 选中Hello.g4文件,右键 → \rightarrow Configure ANTLR ...,进行相关配置
  • 完成配置后,再次选中Hello.g4文件,右键 → \rightarrow Generate ANTLR Recognizer,会在指定目录生成指定包名的Java代码
  • 注意:
    • 使用antlr4插件指定包名具有双重作用,既为生成的Java代码指定了package,还为生成的Java文件指定了包路径。
    • 因此,无需再在.g4文件中指定package信息。否则,生成的Java代码将因为拥有两个相同的package而报错

4. Antlr4的maven plugin

  • 在开源组件尤其是计算引擎中,经常使用使用Antlr4定义SQL语法
  • 若不做好相应的代码配置,则会导致用户需要在本地安装Antlr Tools或者在IDEA中配置Antlr插件,这对用户来说是十分不友好的
  • 因此,Antlr4还有对应的maven插件(antlr4-maven-plugin),便可以实现代码的友好编译

4.1 通过maven插件生成Java代码

  • 在pom.xml文件中添加如下内容,便可引入并配置antlr4-maven-plugin
    <plugin>
        <groupId>org.antlr</groupId>
        <artifactId>antlr4-maven-plugin</artifactId>
        <version>${antlr.version}</version>
        <executions>
            <execution>
                <id>antlr</id>
                <goals>
                    <goal>antlr4</goal>
                </goals>
                <phase>generate-sources</phase>
            </execution>
        </executions>
        <configuration>
            <sourceDirectory>${basedir}/src/main/resources</sourceDirectory>
            <outputDirectory>${basedir}/src/main/java</outputDirectory>
            <listener>true</listener>
            <visitor>true</visitor>
            <treatWarningsAsErrors>true</treatWarningsAsErrors>
        </configuration>
    </plugin>
    
  • 最终在/src/main/java目录下生成对应的Java文件

4.2 使用maven插件的注意事项

  1. 如果想在指定包下生成对应的Java文件,需要做如下修改,并且两个修改缺一不可

    • Hello.g4中,添加通过@header指定package
      @header{
      package com.sunrise.hello;
      }
      
    • 修改antlr4-maven-plugin的配置,将outputDirectory改为包路径。
      <outputDirectory>${basedir}/src/main/java/com/sunrise/hello</outputDirectory>
      
  2. 如果指定了package,却未指定对应的包目录,则会出现package name与file path不一致的情况

  3. 保持antlr4-maven-plugin与antrl4-runtime的版本一致,避免因为complication和runtime的Antlr版本不一致而运行失败。因此,建议使用maven property统一管理Antlr4的版本

    <antlr.version>4.8</antlr.version>
    

5. 后记

5.1 参考文档

5.2 后续计划

  • 通过antlr4,实现一个简单的计算器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值