2008年2月13日水曜日

ANTLRの文法ファイル(.g)をNetBeans Scriptingファイル(.nbs)に変換する

今回はANTLRの文法ファイルをNetBeans Scriptingファイルへ変換するこの記事を元に書いています
※本家でもNBSをNetBeans Schliemannとしたり、NetBeans Scriptingとしたりと混在していますが、ここでは後者を採用して説明します
なお、以降の手順で変換は正しく行われるかと思いますが、生成されたファイルがそのまま使えることを保証するものではありません
個人的には参考として見る程度のものと思っています
(変換元の文法ファイルの質によるかもしれませんが)

それではまず、ANTLRを入手します
ANTLRは最新(08年02月現在)の3.x系ではなく、2.x系を使います
ココからダウンロードして下さい
今回は"antlr-2.7.7.tar.gz"を使用して解説します
ダウンロードしたファイルを適当な場所に展開して下さい
(以降、展開したディレクトリを説明上"srcdir"とします)
$ tar xvfz antlr-2.7.7.tar.gz


次にNBSファイルへと変換するプログラムをダウンロードします
上記記事内の「Can you share the code of your NBS generator with us?」の項にあるリンクより"NBSCodeGenerator.java"ファイルをダウンロードして下さい
ダウンロードしたファイルは展開したディレクトリ内のantlrディレクトリへ移動します
$ mv NBSCodeGenerator.java ${srcdir}/antlr

次は記事中にある通り、antlr.Tool.javaを修正します
$ vi ${srcdir}/antlr/Tool.java

修正箇所は以下の通りです
(太字が追加(or 修正)箇所になります)

1. NBS生成のためのフラグを追加
/** Generate HTML vs code? */
boolean genHTML = false;
/** Generate NBS vs code? */
boolean genNBS = false;

2. 新たに"-nbs"引数を認める処理を追加
else if (args[i].equals("-nbs")) {
    genNBS = true;
    genDiagnostics = false;
    setArgOK(i);
}

3. "genNBS"がセットされた際に言語形式の"NBS"を返す処理を追加
if (genHTML) {
    return "HTML";
}
if (genNBS) {
    return "NBS";
    }

4. おまけにusageも追加します
(これは変換処理に関わる修正ではありませんので、追加は自由です)
System.err.println(" -html generate a html file from your grammar.");
System.err.println(" -nbs generate a nbs file from your grammar.");

antlr.Tool.javaの修正は以上ですが、先に追加した"NBSCodeGenerator.java"がmake実行時にコンパイルされるようmakeファイルを修正する必要があります
$ vi ${srcdir}/antlr/Makefile.in

修正箇所は下記の通りです
@abs_top_srcdir@/antlr/HTMLCodeGenerator.java ¥
@abs_top_srcdir@/antlr/NBSCodeGenerator.java ¥


以上で準備ができましたので、makeします
$ ${srcdir}/configure
$ make
$ make test # オプション
$ su root # オプション
$ make install

makeが正常に終了し、インストールが完了したら、早速変換を行ってみます
なお、インストールディレクトリは/usr/local以下として説明します

まずはCLASSPATHを通します
$ CLASSPATH="/usr/local/antlr/lib/antlr.jar":$CLASSPATH

"-nbs"オプションをつけて文法ファイルからNBSファイルへ変換させます
$ java antlr.Tool -nbs java.g
ANTLR Parser Generator Version 2.7.7 (20080213) 1989-2005
Generating JavaRecognizer.nbs
Generating JavaLexer.nbs

先述の通り、生成されたNBSファイルがそのままNetBeansモジュール開発の言語サポートで使っても文法エラーが頻発する場合が多いので、これを元にするか、参考にして新規でNBSファイルを作るのが現実的だと思います

0 件のコメント: