COINSコンパイラ・インフラストラクチャ を使って、 LR パーサを使った例「1.コンパイラ作成例(その1:簡単な宣言と式)」 をコンパイルしてみます。
COINS のための環境は、COINS で hello.c をコンパイルしてみるで使ったものを流用していますので、参照下さい。
以下のものをダウンロードします。URL およびファイル名はダウンロード時点 (2010/07 現在) のものです。
SimpleDriver.java、simple1.l(.txt)、simple1.y(.txt)
※simple1.l および simple1.y のリンク先ファイル名は拡張子が .txt になっています。
以下ではリネームせずに、そのままのファイル名(simple1.l.txt、simple1.y.txt)で使用しています。
拡張子 .txt はちょっと、、、という方はきちんとリネームしてお使い下さい。
jflex-1.4.3.zip
jay.jar、src.zip
※jay.jar はページの下の方の「archive with class files and skeletons for any Java VM」のリンクから、
src.zip は「source files」のリンクからダウンロードします。
jflex-1.4.3.zip を展開します。
ここでは、「C:\Bin\jflex-1.4.3」に展開しました。
※展開すると「jflex」、「jflex-1.4.3」の 2 つのディレクトリができますが、どちらの内容も同じものでした。お好きな方をお使い下さい。
展開後に、システム環境変数に以下の値を設定します。
C:\Bin\jflex-1.4.3\bin\jflex.bat を以下のように修正します。
@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.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 をコピーします。
コマンドプロンプトを開き、ワークディレクトリ「C:\Usr\Work」へ移動して、simple1.l.txt から スキャナのソースコードを生成します。
jflex -d simple simple1.l.txt
「simple」ディレクトリ下に Scanner.java が生成されます。
ワークディレクトリ「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 バイト)