antlr4-maven-plugin の簡単な学習

1. 前文

  • antlr4-maven-plugin の正式な導入は次のとおりです。

    The ANTLR 4 plugin for Maven can generate parsers for any number of grammars in your project.
    
  • ブログ「Mac での Antlr4 環境の構築」では、 antlr4-maven-plugin を使用して .g4 ファイルをコンパイルする方法を紹介しています。

  • ここでは、オープン ソース コンポーネントでの antlr4-maven-plugin の使用方法と、使用上の追加の考慮事項を紹介します。

2. オープンソースコンポーネントでの antlr4-maven-plugin の使用

2.1 Presto での antlr4-maven-plugin の構成

  • Presto を例に取ると、presto-parser モジュールの pom.xml ファイルでの antlr4-maven-plugin の構成は非常に簡単です。

    <build>
        <plugins>
            <plugin>
                <groupId>org.antlr</groupId>
                <artifactId>antlr4-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
  • これは、ここでの設定が presto-root (プロジェクトの親モジュール) から antlr4-maven-plugin の設定を継承しているためです。

    <dep.antlr.version>4.7.1</dep.antlr.version>
    
    <!-- 指定了插件的版本、goal以及是否生成vistor代码 -->
    <pluginManagement>
      <plugins>
          <plugin>
              <groupId>org.antlr</groupId>
              <artifactId>antlr4-maven-plugin</artifactId>
              <version>${dep.antlr.version}</version> 
              <executions>
                  <execution>
                      <goals>
                          <goal>antlr4</goal>
                      </goals>
                  </execution>
              </executions>
              <configuration>
                  <visitor>true</visitor>
              </configuration>
          </plugin>
    </pluginManagement>      
    
  • 4.1の構成と比較すると、この構成は非常に合理化されており、たとえば、sourceDirectory、outputDirectory、listener という 3 つの主要な構成が欠落しています。

2.2 antlr4-maven-pluginの設定項目

  • 設定項目をクリックして入力しますplugin.xml

  • 詳細については、plugin.xml を参照してください。これには、構成された名前、タイプ、必須、説明、デフォルト値などが含まれます。

    <!-- 定义和描述 -->
    <parameter>
      <name>sourceDirectory</name>
      <type>java.io.File</type>
      <required>false</required>
      <editable>true</editable>
      <description>The directory where the ANTLR grammar files ({@code *.g4}) are located.</description>
    </parameter>
    
    <!-- 默认值 -->
    <sourceDirectory implementation="java.io.File" default-value="${basedir}/src/main/antlr4"/>
    <outputDirectory implementation="java.io.File" default-value="${project.build.directory}/generated-sources/antlr4"/>
    
  • sourceDirectory と OutputDirectory のデフォルト値から、.g4 ファイルの場所とコンパイルされた Java コードのパスが4.1のものとは大きく異なることがわかります。たとえば、生成された Java コードを、target/generated-sources/antrl4私たちが理解している/src/main/javaディレクトリではなくディレクトリに配置することもできます。

2.3 Presto の .g4 ファイルと生成された Java コード

  • presto-parser モジュール、SqlBase.g4ファイルをsrc/main/antlr4/com/facebook/presto/sql/parserディレクトリに置きます
  • ローカル コンパイルが完了するとmvn clean install -DskipTeststarget/generated-sources/antlr4/com/facebook/presto/sql/parser関連する Java コードがディレクトリに生成されます。
  • 同時に、src/main/antlr4以下のJava コード内のパッケージ情報になります。
  • target/generated-sources/antlr4ディレクトリ内のこれらのJava コードは、最終的にコンパイルされ、同じバージョンの antlr-runtime を使用して実行されます。
  • 通常の Java コードと同様に、これらの Java コードをコンパイルして生成された .class ファイルもtarget/classes/ディレクトリに配置されます。
  • このため、Presto をローカルで実行する場合は、最初にグローバル コンパイルを実行する必要があります。そうしないと、直接実行したときにさまざまなタイプが見つからないというメッセージが表示されます。

3. JDK の Antlr4-maven-plugin のバージョン要件

  • antlr バージョンを 4.10.1 として定義し (antlr4-maven-plugin と antlr-runtime のバージョンは両方とも 4.10.1)、mvn clean installantlr4-maven-plugin を使用して .g4 ファイルをコンパイルするコマンドを実行しますが、エラーメッセージは次のとおりです。

    java.lang.UnsupportedClassVersionError: org/antlr/v4/Tool 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
        at java.lang.ClassLoader.defineClass1 (Native Method)
        at java.lang.ClassLoader.defineClass (ClassLoader.java:763)
        at java.security.SecureClassLoader.defineClass (SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass (URLClassLoader.java:468)
        at java.net.URLClassLoader.access$100 (URLClassLoader.java:74)
    
  • 以前に上位バージョンの antlr-4.x-complete.jar をインストールして使用したときにも同じ問題が発生しました。

  • 概要: antlr4-maven-plugin を使用する場合は、Antlr に対応する JDK バージョンを超えないよう注意してください。

  • このうち、バージョンとJDKの対応関係は「クラスがより新しいバージョンのJava環境でコンパイルされている」ことを指します。

おすすめ

転載: blog.csdn.net/u014454538/article/details/129464783