今回作成するファイル
今回は、JavaCCとJJTreeを使ったプログラムの構築方法を中心に見ていきます。ここで作成するのは「hello javacc」か「hello jjtree」を受け取ってメッセージを出力するプログラムです。
次のようなフォルダ構成で4つのファイルを作成します。
| ファイル/フォルダ | 内容 |
| /CodeZine | |
| build.xml | 構築スクリプト |
| build.properties | 環境設定 |
| /src | |
| /codezine | |
| /hello | |
| Hello.java | 処理プログラム |
| HelloParser.jjt | 文法定義ファイル |
| /parser | パーサーが生成されるフォルダ |
| /build | |
| /classes | コンパイル結果が生成されるフォルダ |
JJTreeでの文法定義
まず文法定義をします。JJTreeの文法ファイルの拡張子はjjtにします。
//オプション定義 options{ STATIC=false; MULTI=true; VISITOR=true; } //パーサークラスの定義 PARSER_BEGIN(HelloParser) package codezine.hello.parser; public class HelloParser{ } PARSER_END(HelloParser) //トークンの定義 SKIP: { " " | "\r" | "\t" | "\n" } TOKEN: { <HELLO: "hello"> | <JAVACC: "javacc"> | <JJTREE: "jjtree"> } //構文の定義 ASTHello Hello(): {} { <HELLO> Command() { return jjtThis;} } void Command() #void : {} { JavaCC() | JJTree() } void JavaCC(): {} { <JAVACC> } void JJTree(): {} { <JJTREE> }
このファイルは、大きく4つの部分に分けられます。それぞれについて大雑把に見ていきます。
オプション
最初のoptionsの部分には、生成ファイルに関する設定を記述します。STATICをtrueにするとメソッドなどがすべてstatic定義になるので、若干動作が速くなるということですが、現実的なメリットはあまりないでしょう。常にfalseを指定することになると思います。
MULTIは、ノードごとのクラスを作るか作らないかです。ノードごとにクラスを作った方がコーディングしやすくなるので、trueを指定することになると思います。
VISITORをtrueにすると各ノードのクラスにjjtAcceptメソッドが生成され、Visitorパターンを使ったコーディングが行えるようになります。
JJTree/JavaCCによって自動生成したコードに変更を加えないことを前提に、文法ファイルにJavaコードを埋め込まないようにする場合には、このオプションの組み合わせをお勧めします。
他のオプションについても次にまとめておきます。
| オプション | 型 | 意味 |
| STATIC | boolean | メソッドをすべてstaticにする |
| MULTI | boolean | ノードごとにクラスを生成する |
| VISITOR | boolean | Visitorパターンを利用する |
| LOOKAHEAD | String | LOOKAHEADの規定値 |
| UNICODE_INPUT | boolean | 生成したパーサーがUNICODEでの入力を受け付けるようにする |
| IGNORE_CASE | boolean | 大文字小文字の区別をしない |
| NODE_DEFAULT_VOID | boolean | 特に指定のない場合、ノードを生成しないようにする |
| NODE_EXTENDS | String | ノードの基底クラス |
パーサークラス
PARSER_BEGINからPARSER_ENDまではパーサークラスについて記述します。括弧の中にはパーサーのクラス名を指定します。
最初の行にパーサークラスのパッケージを指定することができます。その後に空のクラス定義を記述しますが、ここにメソッドなどを定義するとパーサーにメンバを追加することができます。今回は文法定義にJavaコードを記述しないようにするので、ここにはコードを書きません。
トークン定義
SKIPやTOKENの部分は、トークンの定義を行います。トークンとは、文字列に対する意味付けです。今回は詳しい記述法を述べませんが、ここではHELLO、JAVACC、JJTREEという3つのトークンを定義しています。
構文定義
トークン定義以降に構文定義を記述しています。これも、今回は詳しい記述法を述べませんが、「hello」で始まって「javacc」か「jjtree」が続くという文法を定義しています。
