ビルドファイル
jjtファイルからはJJTreeによって、JavaCC用のjjファイルとノードクラスのソースファイルを生成します。そのjjファイルからJavaCCでパーサークラスの生成を行い、最後にjavacでコンパイルを行います。
JJTree、JavaCCともコマンドで処理できるのですが、パスの設定や毎回のコマンド入力が煩雑なので、今回はビルドにAntを使います。「build.properties」のjavacc.dirには、JavaCCを解凍したフォルダを指定しておいてください。
<?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>
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 | 処理する文法ファイル |
| javacchome | JavaCCを展開したフォルダ |
| outputdirectory | 出力先フォルダ |
| outputfile | 出力するJavaCC文法ファイル |
また、javaccタスクには次のようなパラメータがあります。
| target | 処理する文法ファイル |
| outputdirectory | 出力先フォルダ |
| javacchome | JavaCCを展開したフォルダ |
環境によって変わる部分はプロパティファイルに抜き出しておきました。このプロパティファイルでは次のような値を設定してあります。
| プロパティ | 値 |
| javacc.dir | JavaCCを展開したフォルダ |
| src.dir | ソースファイルのフォルダ |
| build.classes.dir | コンパイル結果のフォルダ |
| src.jjt.file | JJTree文法ファイル |
| build.parser.dir | JJTreeの出力先 |
| build.jj.file | JJTreeで生成される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.jj | JavaCC用の構文定義ファイル |
| Node.java | 構文ノードをあらわすインターフェイス |
| SimpleNode.java | 構文ノードの基底になる抽象クラス |
| ASTHello.java | Helloノード |
| ASTJJTree.java | JJTreeノード |
| ASTJavaCC.java | JavaCCノード |
| HelloParserVisitor.java | Visitorパターンを実装するためのインターフェイス |
| 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例外です。

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\