文法定義ファイルのコンパイル

 文法定義ファイルを準備したらsableccコマンドを使ってJava Sourceを生成します。

sablecc grammer.sablecc3

 このコマンドにより文法ファイルのあるパスにソースファイルが生成されます。ソースを生成するパスを変更したい場合は -d オプションでパスを指定する事が出来ます。

 Javaのコンパイルは通常通り行っていただければ良いのですが、{package folder}/parser/parser.dat及び{package folder}/lexer/lexer.datを.classと同じフォルダに配置する必要があります。build時にファイルをコピーするようにしてください。

 Androidのプロジェクト内で使いたい場合、以下の図の様に、プロジェクトフォルダにparserというフォルダを作ってbuild.xmlを文法定義ファイルと一緒におき、カスタムビルドの設定をして使うと便利かと思います。

Eclipse - Package Explorer - Parser Folder

Projectへのparserの追加

 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>

 カスタムビルダの設定を行います。

  1. ProjectのPropertiesを開きます。Buildersを選択
    Project Properties - Builders

    プロジェクトのプロパティのBuilders

  2. Buildersを選択してNewからParserを追加
    Choose Config - Ant Builder

    Ant Builderを選択します。

  3. Mainの設定-名前を設定した後にBuildfileとBase Directoryを設定します(Base Directoryは設定しなくてもいけるはずですが、一応)
    Parser Builder - Main

    ParserのBuilder設定 Main

  4. Refreshの設定-こちらの画面の様に設定してください。
    Parser Builder - Refresh

    ParserのBuilder設定 Refresh

  5. Targetsの設定-こちらの画面の様に設定してください。この設定だとAuto Build時の設定が入っていませんので、Grammarを変更したりClean後はManual Buildが必要です。
    Parser Builder - Targets

    パーサのBuilder設定 Targets

  6. OKを押して設定画面を閉じます。

Leave a Reply

Your email address will not be published. Required fields are marked *