文法定義ファイルのコンパイル
文法定義ファイルを準備したらsableccコマンドを使ってJava Sourceを生成します。
sablecc grammer.sablecc3
このコマンドにより文法ファイルのあるパスにソースファイルが生成されます。ソースを生成するパスを変更したい場合は -d オプションでパスを指定する事が出来ます。
Javaのコンパイルは通常通り行っていただければ良いのですが、{package folder}/parser/parser.dat及び{package folder}/lexer/lexer.datを.classと同じフォルダに配置する必要があります。build時にファイルをコピーするようにしてください。
Androidのプロジェクト内で使いたい場合、以下の図の様に、プロジェクトフォルダにparserというフォルダを作ってbuild.xmlを文法定義ファイルと一緒におき、カスタムビルドの設定をして使うと便利かと思います。
build.xmlの内容は以下の通りです。最初の二行の太字の場所を実際の設定にあわせて書き換える必要があります。
<project default="parser"> <property name="file.grammar" location="scalc.sablecc3" /> <property name="folder.package" value="/org/x68k/android/scalc/parser" /> <property name="path.gen" location="../gen" /> <property name="path.bin" location="../bin/classes" /> <property name="folder.parser.source" location="${path.gen}${folder.package}" /> <property name="folder.parser.binary" location="${path.bin}${folder.package}" /> <property name="file.src.lexer.dat" location="${folder.parser.source}/lexer/lexer.dat" /> <property name="file.src.parser.dat" location="${folder.parser.source}/parser/parser.dat" /> <property name="file.dst.lexer.dat" location="${folder.parser.binary}/lexer/lexer.dat" /> <property name="file.dst.parser.dat" location="${folder.parser.binary}/parser/parser.dat" /> <!-- binフォルダ内のparser.datが古いか無ければparser生成をする --> <uptodate property="checkUptodate.grammar" srcfile="${file.grammar}" targetfile="${file.dst.parser.dat}" /> <target name="parser" unless="checkUptodate.grammar"> <exec executable="sablecc" resultproperty="sablecc.result"> <arg line="-d ${path.gen} ${file.grammar}" /> </exec> <echo message="Result: ${sablecc.result}" /> <condition property="failed.to.generate"> <equals arg1="0" arg2="${sablecc.result}" /> </condition> <antcall target="-checkgenerated" /> <!-- copy lexer.dat to binary folder. --> <mkdir dir="${folder.parser.binary}/lexer" /> <copy file="${file.src.lexer.dat}" todir="${folder.parser.binary}/lexer" overwrite="true" /> <!-- copy parser.dat to binary folder. --> <mkdir dir="${folder.parser.binary}/parser" /> <copy file="${file.src.parser.dat}" todir="${folder.parser.binary}/parser" overwrite="true" /> </target> <target name="-checkgenerated" unless="failed.to.generate"> <delete file="${file.dst.lexer.dat}" quiet="true" failonerror="false" /> <delete file="${file.dst.parser.dat}" quiet="true" failonerror="false" /> <fail>failed to generate parser.</fail> </target> <target name="clean"> <delete dir="${folder.parser.binary}" quiet="true" failonerror="false" /> <delete dir="${folder.parser.source}" quiet="true" failonerror="false" /> </target> </project>
カスタムビルダの設定を行います。
ProjectのPropertiesを開きます。Buildersを選択
Buildersを選択してNewからParserを追加
Mainの設定-名前を設定した後にBuildfileとBase Directoryを設定します(Base Directoryは設定しなくてもいけるはずですが、一応)
Refreshの設定-こちらの画面の様に設定してください。
Targetsの設定-こちらの画面の様に設定してください。この設定だとAuto Build時の設定が入っていませんので、Grammarを変更したりClean後はManual Buildが必要です。
OKを押して設定画面を閉じます。