SHOEISHA iD

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

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

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

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

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

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


ビルドファイル

 jjtファイルからはJJTreeによって、JavaCC用のjjファイルとノードクラスのソースファイルを生成します。そのjjファイルからJavaCCでパーサークラスの生成を行い、最後にjavacでコンパイルを行います。

 JJTree、JavaCCともコマンドで処理できるのですが、パスの設定や毎回のコマンド入力が煩雑なので、今回はビルドにAntを使います。「build.properties」のjavacc.dirには、JavaCCを解凍したフォルダを指定しておいてください。

build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="ParserLexer" default="default" basedir=".">
    <target name="init">
        <property file="build.properties"/>
    </target>
    <target name="cc" depends="init">
        <delete dir="${build.parser.dir}"
            includes="*.*"/>
        <jjtree target="${src.jjt.file}"
            outputdirectory="${build.parser.dir}"
            javacchome="${javacc.dir}"/>
        <javacc target="${build.jj.file}"
            javacchome="${javacc.dir}"/>
    </target>
    <target name="compile" depends="init">
        <javac destdir="${build.classes.dir}"
               srcdir="${src.dir}" debug="true">
            <include name="**/*.java"/>
        </javac>
    </target>
</project>
build.properties
javacc.dir=C:\\java\\tool\\javacc-4.0

src.dir=src
build.classes.dir=build/classes

src.jjt.file=${src.dir}/codezine/hello/HelloParser.jjt
build.parser.dir=${src.dir}/codezine/hello/parser
build.jj.file=${src.dir}/codezine/hello/parser/HelloParser.jj

 AntにはJavaCC/JJTree用のタスクが用意されています。javaccタスク、jjtreeタスクともに、オプションを指定できますが、これは文法ファイルに記述した方がよいでしょう。

 jjtreeタスクには次のようなパラメータがあります。

target処理する文法ファイル
javacchomeJavaCCを展開したフォルダ
outputdirectory出力先フォルダ
outputfile出力するJavaCC文法ファイル

 また、javaccタスクには次のようなパラメータがあります。

target処理する文法ファイル
outputdirectory出力先フォルダ
javacchomeJavaCCを展開したフォルダ

 環境によって変わる部分はプロパティファイルに抜き出しておきました。このプロパティファイルでは次のような値を設定してあります。

プロパティ
javacc.dirJavaCCを展開したフォルダ
src.dirソースファイルのフォルダ
build.classes.dirコンパイル結果のフォルダ
src.jjt.fileJJTree文法ファイル
build.parser.dirJJTreeの出力先
build.jj.fileJJTreeで生成されるJavaCC文法ファイル

パーサー生成

 それでは、JJTreeの文法定義ファイルからパーサーを生成してみましょう。antスクリプトのccターゲットを起動します。

C:\java\product\CodeZine>ant cc
Buildfile: build.xml

init:

cc:
   [delete] DEPRECATED - Use of the implicit FileSet is deprecated. 
Use a nested fileset element instead.
   [jjtree] Java Compiler Compiler Version 4.0 (Tree Builder)
   [jjtree] (type "jjtree" with no arguments for help)
   [jjtree] Reading from file C:\java\product\CodeZine\src\codezine\
hello\HelloParser.jjt . . .
   [jjtree] File "C:\java\product\CodeZine\src\codezine\hello\parser
\Node.java" does not exist.  Will create one.
   [jjtree] File "C:\java\product\CodeZine\src\codezine\hello\parser
\SimpleNode.java" does not exist.  Will create one.
   [jjtree] File "C:\java\product\CodeZine\src\codezine\hello\parser
\ASTHello.java" does not exist.  Will create one.
   [jjtree] File "C:\java\product\CodeZine\src\codezine\hello\parser
\ASTJavaCC.java" does not exist.  Will create one.
   [jjtree] File "C:\java\product\CodeZine\src\codezine\hello\parser
\ASTJJTree.java" does not exist.  Will create one.
   [jjtree] Annotated grammar generated successfully in C:\java\prod
uct\CodeZine\src\codezine\hello\parser\HelloParser.jj
   [javacc] Java Compiler Compiler Version 4.0 (Parser Generator)
   [javacc] (type "javacc" with no arguments for help)
   [javacc] Reading from file C:\java\product\CodeZine\src\codezine\
hello\parser\HelloParser.jj . . .
   [javacc] File "TokenMgrError.java" does not exist.  Will create o
ne.
   [javacc] File "ParseException.java" does not exist.  Will create 
one.
   [javacc] File "Token.java" does not exist.  Will create one.
   [javacc] File "SimpleCharStream.java" does not exist.  Will creat
e one.
   [javacc] Parser generated successfully.

BUILD SUCCESSFUL
Total time: 1 second

 JJTreeによって、JavaCCの文法ファイル「HelloParser.jj」とノードクラスのソースファイルが生成されます。ここで生成されるファイルは次のとおりです。各構文ノードにASTをつけたクラスが生成されています。

生成されるファイル内容
HelloParser.jjJavaCC用の構文定義ファイル
Node.java構文ノードをあらわすインターフェイス
SimpleNode.java構文ノードの基底になる抽象クラス
ASTHello.javaHelloノード
ASTJJTree.javaJJTreeノード
ASTJavaCC.javaJavaCCノード
HelloParserVisitor.javaVisitorパターンを実装するためのインターフェイス
HelloParserTreeConstants.java構文木をあらわすための定数
JJTHelloParserState.javaパーサーの状態

 JavaCCで「HelloParser.jj」ファイルから構文解析用のプログラムが生成されます。JavaCCで作られるファイルは次のようになります。

生成されるファイル内容
HelloParser.javaパーサークラス(このクラスを直接利用する)
ParseException.java構文エラーを表す例外
TokenMgrError.java字句解析エラーを表す例外
HelloParserConstants.java字句解析用の定数
HelloParserTokenManager.java字句解析器
SimpleCharStream.java入力用のストリーム
Token.javaトークンを表すクラス

 実際のプログラムから利用するのはNodeインターフェイス、HelloParserVisitorインターフェイス、HelloParserクラス、ParserException例外、TokenMgrError例外です。

次のページ
処理プログラム

修正履歴

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

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

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー