作成日: 2010/07/19

COINS のサンプルをコンパイルしてみる

概要

COINSコンパイラ・インフラストラクチャ を使って、 LR パーサを使った例「1.コンパイラ作成例(その1:簡単な宣言と式)」 をコンパイルしてみます。

COINS のための環境は、COINS で hello.c をコンパイルしてみるで使ったものを流用していますので、参照下さい。

ダウンロード

以下のものをダウンロードします。URL およびファイル名はダウンロード時点 (2010/07 現在) のものです。

  • サンプルソース
    http://www.coins-project.org/advanceduse/simple/coinsCompiler.html#1

    SimpleDriver.java、simple1.l(.txt)、simple1.y(.txt)
    ※simple1.l および simple1.y のリンク先ファイル名は拡張子が .txt になっています。 以下ではリネームせずに、そのままのファイル名(simple1.l.txt、simple1.y.txt)で使用しています。
    拡張子 .txt はちょっと、、、という方はきちんとリネームしてお使い下さい。

  • JFlex
    http://www.jflex.de/

    jflex-1.4.3.zip

  • jay
    http://www.cs.rit.edu/~ats/projects/lp/doc/jay/package-summary.html

    jay.jar、src.zip
    ※jay.jar はページの下の方の「archive with class files and skeletons for any Java VM」のリンクから、 src.zip は「source files」のリンクからダウンロードします。

JFlex のインストールと設定

jflex-1.4.3.zip を展開します。
ここでは、「C:\Bin\jflex-1.4.3」に展開しました。
※展開すると「jflex」、「jflex-1.4.3」の 2 つのディレクトリができますが、どちらの内容も同じものでした。お好きな方をお使い下さい。

展開後に、システム環境変数に以下の値を設定します。

  • PATH: C:\Bin\jflex-1.4.3\bin を追加

C:\Bin\jflex-1.4.3\bin\jflex.bat を以下のように修正します。

  • JFLEX_HOME を C:\Bin\jflex-1.4.3 に変更する
  • JAVA_HOME 関連の設定は除く
  • for JDK 1.1.x の箇所をコメントにし、for JDK 1.2 の箇所を有効にする
@echo off
REM Please adjust the paths JFLEX_HOME and JAVA_HOME to suit your needs
REM (please do not add a trailing backslash)

set JFLEX_HOME=C:\Bin\jflex-1.4.3

REM only needed for JDK 1.1.x:
rem set JAVA_HOME=C:\JAVA


REM -------------------------------------------------------------------

rem set CLPATH=%JAVA_HOME%\lib\classes.zip;%JFLEX_HOME%\lib\JFlex.jar
set CLPATH=%JFLEX_HOME%\lib\JFlex.jar

REM for JDK 1.1.x
rem %JAVA_HOME%\bin\java -classpath %CLPATH% JFlex.Main %1 %2 %3 %4 %5 %6 %7 %8 %9

REM for JDK 1.2
java -Xmx128m -jar %JFLEX_HOME%\lib\JFlex.jar %1 %2 %3 %4 %5 %6 %7 %8 %9
jay の展開と配置

コンパイル作業を行うワークディレクトリを決め、jay.jar をそこにコピーします。
ここでは、「C:\Usr\Work」下にコピーしました。
また、src.zip を展開し、jay\java\skeleton.java をワークディレクトリにコピーします。

サンプルソースの配置

ワークディレクトリ「C:\Usr\Work」下に、simple1.l.txt、simple1.y.txt をコピーします。

なお、simple1.y.txt のエンコーディングが EUC になっているため、適当なエディタで開き、 Shift-JIS に変更して、保存し直して下さい。 さらに、simple1.y.txt の setOptionalParam() 呼び出しを行っている箇所をコメントにします。
※setOptionalParam() は、最新の COINS では使えないようなのですが、代わりにどうすれば良いのか、 現時点で私にはわからないので、コメントにしています。

//    printfSym.setOptionalParam();
...
//    scanfSym.setOptionalParam();

ワークディレクトリ下にディレクトリ「simple」を作成し、そこに SimpleDriver.java をコピーします。

JFlex でスキャナのソースコードを生成

コマンドプロンプトを開き、ワークディレクトリ「C:\Usr\Work」へ移動して、simple1.l.txt から スキャナのソースコードを生成します。

jflex -d simple simple1.l.txt

「simple」ディレクトリ下に Scanner.java が生成されます。

jay でパーサのソースコードを生成

ワークディレクトリ「C:\Usr\Work」のままで、simple1.y.txt から パーサのソースコードを生成します。

java -jar jay.jar simple1.y.txt skeleton.java > simple\Parser.java

「simple」ディレクトリ下に Parser.java が生成されます。

スキャナ、パーサ、ドライバのコンパイル

ワークディレクトリ「C:\Usr\Work」のままで、上記で生成した Scanner.java、Parser.java と ダウンロードした SimpleDriver.java をコンパイルします。

javac -classpath C:\Bin\coins-1.4.4.4-ja\classes simple\*.java

「simple」ディレクトリ下のソースがコンパイルされ、class ファイルが作成されます。

コンパイルと実行

以下の内容をエディタで編集し、expr1.c として、ワークディレクトリ「C:\Usr\Work」下に保存します。

int a, b;
read a;
b = a + 5;
write b;

以下の内容をエディタで編集し、compile2.bat として、ワークディレクトリ「C:\Usr\Work」下に保存します。

@echo off

setlocal

set COINS_HOME=C:\Bin\coins-1.4.4.4-ja
set GCC_HOME=C:\Bin\MinGW

java -classpath %COINS_HOME%\classes;. simple.SimpleDriver -D_MT -U__MSVCRT__ -I%GCC_HOME%\include -o %1 -coins:target=x86-cygwin,assembler=as %1.c

endlocal

コマンドプロンプトを開き、ワークディレクトリ「C:\Usr\Work」に移動し、expr1.c をコンパイルします。

compile2 expr1

コンパイルが済んだら、実行します。
※実行後、3 を入力して、計算結果 8 が表示されています。

コマンドプロンプト
バッチファイルなど

バッチファイルなど

sample.zip (470 バイト)