minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

前の章ではAntlrの簡単な使い方を説明しました。
ここでは、もう少し詳しく使ってみることにします。

packageを指定する

初めの頃は別にいいですが、やはりいつまでも
デフォルトパッケージのまま使ってるわけにもいかないでしょう。
パッケージを指定するには、ファイルの先頭に以下を記述します。

header {
  package my.package;
}

ここにはパッケージ宣言だけでなく、import宣言なども記述できます。

解析に応じた処理を行う

以下のようなルールを考えます。

numbers:
  (NUMBER)+
;

見ての通り、数字を一つ以上並べた文字列に適合するルールです。
ここで、解析した数字を合計した結果を返すようなメソッドを作成することにします。

まずは、解析した数字を標準出力に吐き出してみます。

numbers:
  (token : NUMBER { System.out.println(token.getText()); })+
;

書式は以下のようになります。

( 任意の変数名 : リテラル { 任意のJavaコード } )

この例では、変数名を token として、Javaコード内で標準出力処理を行っています。
変数 token の型は、antlr.Token です。

※ Antlr3では org.antlr.runtime.Token になるようです

戻り値を使うには、宣言文に若干手を加えます。

numbers returns [int result = 0]
:

ここで定義した変数が戻り値として返される事になります。
あとは、処理内でこの変数にアクセスするだけです。

numbers returns [int result = 0]
:
  (token : NUMBER { result += Integer.parseInt(token.getText()); })+
;

呼び出し側は以下のような感じになります。

int result = parser.numbers();
System.out.println("sum = " + result);