【KLICマクロ展開プログラム】


by

杉野栄二、横田治夫 at JAIST (北陸先端科学技術大学院大学)



[用途]

KL1ソースプログラムに対して加工を行ないたいときに、じゃまになる KLICのマクロ表記をとりのぞきたいとき、 またKLICで記述されたプログラムをPIMへ移植したいときにも役立つ。 あるいは、KLICで記述されたマクロが どのように展開されるかを 確かめたいときに有効である。

[機能]

本プログラムは、KLICにおけるマクロ表記等を含むKL1プログラムを ほぼプレーンなKL1プログラムに変換し、標準出力へ出力する。

[実行環境]

[ファイル構成]

expand/
README.j
README-j.html
README.e
README-e.html
Makefile
diff.kl1
kl1cmp.kl1
kl1cmp0.kl1
macro.kl1
main.kl1
obj.kl1
util.kl1
write.kl1
difftest
test

[インストール方法]

必要に応じてMakefile を修正し、

make all で実行形式 kl1expand が作られる。

[使い方] 変換結果は、標準出力に出力される。

その1)ファイルから入力する場合

% kl1expand File1 File2 ...
入力ファイル名は、***.kl1 の形であること。

その2)標準入力から入力する場合

% cat hogehoge.kl1 | kl1expand user
入力ファイル名として 'user' を指定すれば、標準入力からプログラムを 読み込む。

[変換後のプログラムについて]

  • KLICのコンパイラを元にしているため、ガードのOR
    head :- (guard1 ; guard2) | body.
    の形はそのまま出力する。 ・ モジュール宣言以下のコマンド

    :- xxxxx.

    は、モジュール内の述語定義の一番最後にまとめて出力される。

    ・ モジュール宣言前のコマンドは、モジュール宣言の前に出力される。

    [KLICのバージョンアップに対応するヒント]

    本プログラム対応版のKLICコンパイラ(compilerディレクトリ以下の *.kl1)を、 新版のコンパイラと比較して、それに対応するプログラムを変更する。
    KLICのバージョンアップに対応するために、ファイル名モジュール名等 できるだけ保存するようにしてある。
    対応するオリジナルのファイルとの共通部分の比較機能

    % make cmp

    も提供する。本プログラムの相違部分には、% IGNORE ... 等のコメントがあるが、 この比較機能はこの部分だけ無視して比較を行なうため、共通部分に変更が あれば、この機能でわかる。

    [試験]

    本プログラム自身を展開した結果とオリジナルプログラムに対して、 klicでコンパイルした結果で比較した。

    試験方法

    % kl1expand XXX.kl1 > tmp.kl1
    % klic -c XXX.kl1 tmp.kl1
    % cmp XXX.c tmp.c

    試験結果

    • main.kl1 ○
    • write.kl1 ○
    • util.kl1 △
    • obj.kl1 △
    • macro.kl1 △
    • kl1cmp.kl1 ×
    ○は一致したもの、
    △はkl1cmp.kl1 中の tidy_clause を行なわないと一致する。

    tidy_clauseは、変数名のつけかえ等を行なって 結果クローズの見栄えを良くするものである。 このため、変数の割り付け方が変わるものと思われる。

    kl1cmp.kl1 のかわりに kl1cmp0.kl1を用いてコンパイルすると tidy_clauseを行わない結果が得られる。

    ×は、述語のコンパイル順序が変わることによる。

    クローズ内のif-then 表記マクロの展開によって、新たに生成 される述語の順序が オリジナルのコンパイラでは逆順になっている。 このため、内部で生成するテーブル、ラベル名等の割り付けが 異る。


    本文章について

    • 1996年10月25日 記述 by Eiji Sugino
    • 1996年12月19日 修正後、再試験結果で本文を修正
    • 1997年2月28日 修正履歴 追加
    • 1997年5月20日 html化

    変更履歴:

    • klic (limited release version 2.004) コンパイラをもとに作成。 [Version 1.0] 1996.10.25 by 杉野栄二 (sugino@jaist.ac.jp) ただし、klic (version 3.001)での動作を確認(1997.7.30) 。
    • 1996.10.31 プリティプリントを変更
      • orゴールの表記に段下げをつけた。
      • ボディ変数と非変数のボディユニファイが 出ないようにした。(変数を非変数に置き換える)
    • 1996.12.19 プリティプリントを修正 ボディで冗長なユニフィケーションが出ていたため。
    • 1997.02.28 ガード組み込み述語の演算部分の表記を修正 (divide(A,B,C) -> C := A/B 等)

    sugino@jaist.ac.jp