Skip to content

ANTLR チュートリアルを試す

ANTRL とは g4 と呼ばれる文法ファイルを入力し、構文木の解析を行う解析器を自動生成してくれるツールです。 公式サイトでは以下のように説明されています。

ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It's widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser that can build and walk parse trees.

今回は公式サイトにあるチュートリアルを実行した手順をメモしておきます。 検証は Ubuntu 22.04LTS 上で行いました。

java のインストール

Java 用のパーサを生成する際に利用する為、JDK をインストールしておきます。

1
apt -y install default-jdk

ANTLR のインストール

.jar ファイルとして配布されていますので、ライブラリのパスにダウンロードしておきます。

1
2
3
curl \
  -L https://www.antlr.org/download/antlr-4.10.1-complete.jar \
  -o /usr/local/lib/antlr-4.10.1-complete.jar

環境変数の設定

Java のクラスパスと ANTLR で利用する alias を定義しておきます。 定義した後は source ~/.bashrc するなり、ログアウト&ログインし直すなりして環境編集と alias を反映しておきます。

1
2
3
4
5
cat << 'EOF' >> ~/.bashrc
export CLASSPATH=".:/usr/local/lib/antlr-4.10.1-complete.jar:$CLASSPATH"
alias antlr4='java -jar /usr/local/lib/antlr-4.10.1-complete.jar'
alias grun='java org.antlr.v4.gui.TestRig'
EOF

文法 (g4) ファイルの用意

「g4」と呼ばれる文法ファイルを用意しておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
cat << 'EOF' > Expr.g4
grammar Expr;  
prog: (expr NEWLINE)* ;
expr: expr ('*'|'/') expr
    | expr ('+'|'-') expr
    | INT
    | '(' expr ')'
    ;
NEWLINE : [\r\n]+ ;
INT     : [0-9]+ ;
EOF

解析器の生成

ANTLR は g4 ファイルを入力することで様々なプログラミング言語向けの解析器を生成することが出来ます。 今回は

1
antlr4 Expr.g4

ANTLR によって Java 用の解析器のソースコードが生成されました。

1
2
3
# ls
Expr.g4      Expr.tokens            ExprLexer.interp  ExprLexer.tokens   ExprParser.java
Expr.interp  ExprBaseListener.java  ExprLexer.java    ExprListener.java

これをコンパイルし、解析器を生成します。

1
javac Expr*.java

解析器が生成されました。

1
2
3
4
# ls
 Expr.g4       ExprBaseListener.class   ExprLexer.interp   ExprListener.class             'ExprParser$ProgContext.class'
 Expr.interp   ExprBaseListener.java    ExprLexer.java     ExprListener.java               ExprParser.class
 Expr.tokens   ExprLexer.class          ExprLexer.tokens  'ExprParser$ExprContext.class'   ExprParser.java

テスト用ファイルの準備

解析器で解析したいファイルを用意します。 今回は test1.txt というファイル名で用意しました。 中身は「100+2*34」となっており、これが前述の .g4 ファイルで定義された文法に従って解析されることを確認していく、ということになります。

1
2
3
cat << 'EOF' > test1.txt
100+2*34
EOF

以下のように実行し、「どのような構文木として解析されたのか?」を確認します。 -tree オプションを指定すると以下のような構文木を表示させることが出来ます。

1
2
# grun Expr prog -tree < test1.txt
(prog (expr (expr 100) + (expr (expr 2) * (expr 34))) \n)