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 をインストールしておきます。
apt -y install default-jdk
ANTLR のインストール
.jar ファイルとして配布されていますので、ライブラリのパスにダウンロードしておきます。
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 を反映しておきます。
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」と呼ばれる文法ファイルを用意しておきます。
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 ファイルを入力することで様々なプログラミング言語向けの解析器を生成することが出来ます。 今回は
antlr4 Expr.g4
ANTLR によって Java 用の解析器のソースコードが生成されました。
# ls
Expr.g4 Expr.tokens ExprLexer.interp ExprLexer.tokens ExprParser.java
Expr.interp ExprBaseListener.java ExprLexer.java ExprListener.java
これをコンパイルし、解析器を生成します。
javac Expr*.java
解析器が生成されました。
# 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 ファイルで定義された文法に従って解析されることを確認していく、ということになります。
cat << 'EOF' > test1.txt
100+2*34
EOF
以下のように実行し、「どのような構文木として解析されたのか?」を確認します。 -tree
オプションを指定すると以下のような構文木を表示させることが出来ます。
# grun Expr prog -tree < test1.txt
(prog (expr (expr 100) + (expr (expr 2) * (expr 34))) \n)
コメント