SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

JavaCCでスクリプト言語を作成する

JavaCCでスクリプト言語を作成する 第1回

JavaCCとJJTreeを使ったプログラムの構築方法


今回作成するファイル

 今回は、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にします。

codezine/hello/HelloParser.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コードを埋め込まないようにする場合には、このオプションの組み合わせをお勧めします。

 他のオプションについても次にまとめておきます。

オプション意味
STATICbooleanメソッドをすべてstaticにする
MULTIbooleanノードごとにクラスを生成する
VISITORbooleanVisitorパターンを利用する
LOOKAHEADStringLOOKAHEADの規定値
UNICODE_INPUTboolean生成したパーサーがUNICODEでの入力を受け付けるようにする
IGNORE_CASEboolean大文字小文字の区別をしない
NODE_DEFAULT_VOIDboolean特に指定のない場合、ノードを生成しないようにする
NODE_EXTENDSStringノードの基底クラス

パーサークラス

 PARSER_BEGINからPARSER_ENDまではパーサークラスについて記述します。括弧の中にはパーサーのクラス名を指定します。

 最初の行にパーサークラスのパッケージを指定することができます。その後に空のクラス定義を記述しますが、ここにメソッドなどを定義するとパーサーにメンバを追加することができます。今回は文法定義にJavaコードを記述しないようにするので、ここにはコードを書きません。

トークン定義

 SKIPやTOKENの部分は、トークンの定義を行います。トークンとは、文字列に対する意味付けです。今回は詳しい記述法を述べませんが、ここではHELLO、JAVACC、JJTREEという3つのトークンを定義しています。

構文定義

 トークン定義以降に構文定義を記述しています。これも、今回は詳しい記述法を述べませんが、「hello」で始まって「javacc」か「jjtree」が続くという文法を定義しています。

次のページ
ビルドファイル

修正履歴

この記事は参考になりましたか?

JavaCCでスクリプト言語を作成する連載記事一覧

もっと読む

この記事の著者

きしだ なおき(キシダ ナオキ)

フリーのプログラマ。Javaでの業務アプリケーションからC++での小型端末などさまざまなプログラムを開発。また、入門者向けのJavaセミナーなども行う。そのセミナーで鍛えられたテキストが、著書である「創るJava」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/367 2006/08/09 11:26

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー