JPH10154079A - プログラム変換装置および記憶媒体 - Google Patents

プログラム変換装置および記憶媒体

Info

Publication number
JPH10154079A
JPH10154079A JP9247940A JP24794097A JPH10154079A JP H10154079 A JPH10154079 A JP H10154079A JP 9247940 A JP9247940 A JP 9247940A JP 24794097 A JP24794097 A JP 24794097A JP H10154079 A JPH10154079 A JP H10154079A
Authority
JP
Japan
Prior art keywords
program
syntax
rule
syntax tree
conversion
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP9247940A
Other languages
English (en)
Inventor
Mutsumi Komuro
睦 小室
Akifumi Kumeta
暁文 久米田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Software Engineering Co Ltd
Original Assignee
Hitachi Software Engineering Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Software Engineering Co Ltd filed Critical Hitachi Software Engineering Co Ltd
Priority to JP9247940A priority Critical patent/JPH10154079A/ja
Publication of JPH10154079A publication Critical patent/JPH10154079A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

(57)【要約】 【課題】 プログラム作成過程におけるコメント情報、
プログラムの書式などを失うことなくプログラム変換を
行うことができるようにする。また、ルールを書き換え
ることなくルールの適用順序を変更することができるよ
うにする。 【解決手段】 字句・構文解析時にプログラムのテキス
ト情報を蓄積してゆき、構文解析結果である構文木の各
節に保持させる。そして、どの構文要素型の節に保持さ
せるかはユーザが指定可能にする。さらに、構文木に型
階層を導入し、型を保つルールしか許さないことにし、
型毎に変換ルールを分類して保持する。書き換えルール
は、基本的にパターン変数を含んだプログラムパターン
の組により記述し、第1のパターンで指定されたプログ
ラム部分を第2のパターンのプログラム部分に書き換え
るようにし、さらに、拡張形式としてルールに条件部を
付加し、ルールの適用に制限を加える。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、プログラム変換装
置および記憶媒体に関し、複雑な構文を持ったプログラ
ムを構文解析し、その結果を書き換えルールに基づき、
別のプログラムへと書き換えるプログラム変換装置およ
び記憶媒体に関する。
【0002】
【従来の技術】従来において、変換対象の入力プログラ
ムを別のプログラムへ変換する方法として、入力プログ
ラムを単なるテキストデータと見做し、文書編集ツール
をプログラムの書き換えに援用する方法が知られてい
る。しかし、ここでは、プログラムの構造まで考慮した
書き換えを行うことは想定していない。
【0003】これに対し、記号処理用言語Lispに対
してはプログラムの構造を考慮した書き換えツールが言
語仕様の一部として用意され、新しい制御構造の導入の
目的に標準的に用いられているが、これはLisp言語
の構文が非常に簡単で、プログラムそのものがすでに構
文木の形をしているという事実に基づいているものであ
る。しかし、複雑な構造のプログラムには適用できな
い。
【0004】また、複雑な構文をもつ言語の代表として
C言語がある。C言語にも組み込みの書き換えツールが
付属しているが、これは構文木に作用するものではな
く、プログラムを文字列の並びと見て文字列の書き換え
を行うものである。
【0005】また、書き換えにとどまらない一般のプロ
グラム変換技術は、コンパイラ、部分計算等に用いられ
てきたが、これらの適用対象では字句・構文解析を簡単
に行うためにコメント情報、プログラムの書式など、プ
ログラマにとって有用であってもコンピュータ上の実行
に不要な情報は前もって削除している。これらの情報は
解析結果の構文木上の節(構文要素)には対応しないた
め、通常の字句・構文解析の方法では扱うことができな
い。
【0006】一方、特開平5−181651号の「プロ
グラム自動生成装置」に開示されているように、設計知
識を変換対象部分と変換対象にならない部分に分離する
ことにより、変換途中の仕様を小さく保ち検索時間を削
減する方法がある。
【0007】この特開平5−181651号では、仕様
を構文木の形に表現して変換を行っているが、プログラ
ムに対して変換を行うことは適用範囲とされていない。
【0008】
【発明が解決しようとする課題】上記した従来のプログ
ラム変換技術は、コンパイラ,部分計算等に用いられて
きたが、これらの適用対象では、変換結果はコンピュー
タが実行すべきものであり、人間が読み書きすることは
想定されていなかった。すなわち、コンピュータ上の実
行には不要であるが、プログラマにとって有用な情報で
あるコメント情報、プログラムの書式などは変換結果か
ら削除されていた。このため、プログラム作成過程での
有用な情報が分からなくなるという問題があった。
【0009】また、書き換えルールにより変換を表現す
る場合、ルール間の競合を制御する必要があるが、従来
はルールの記述順序に従ってプログラムの書き換えを実
行していた。このため、ルールの適用順序を変更する場
合は、ルールの内容の書き換え、記述順序の入れ替えに
よる適用順序の変更など、ルール自体を書き直さなけれ
ばならないという問題があった。
【0010】また、文書編集ルーツの編集機能やC言語
組み込みの書き換えツールによる文字列の書き換えでプ
ログラムを書き換えようとすると、構文木単位で作用し
ないため、変換洩れが起きたり、構文型を保たないた
め、構文上不正なプログラムに書き換わる可能性があっ
た。
【0011】また、マッチする文字列がすべて置き換わ
るため、そのうち特定のものだけに変換を施したり、動
的に一時変数を生成したりすることはできなかった。
【0012】本発明の第1の目的は、プログラム作成過
程におけるコメント情報、プログラムの書式などを失う
ことなくプログラム変換を行うことができるプログラム
変換装置を提供することにある。
【0013】本発明の第2の目的は、ルールを書き換え
ることなくルールの適用順序を変更することができるプ
ログラム変換装置を提供することにある。
【0014】本発明の第3の目的は、書き換えの構文的
安全性を保証することができるプログラム変換装置を提
供することにある。
【0015】本発明の第4の目的は、特定の文字列のみ
に変換を施すなどのルール適用条件を制御することがで
きるプログラム変換装置を提供することにある。
【0016】本発明の第5の目的は、種々のルールを容
易に定義することが可能なプログラム変換装置を提供す
ることである。具体的には、(1)ルールの適用回数に
制限を加えることができるようにする、(2)ルールの
適用条件としてプログラムの型情報を利用できるように
する、(3)ルールを適用したときに付加的な処理とし
て、マッチングの情報を変更・追加できるようにする、
(4)ルールの付加的な処理の記述でプログラムの断片
を引用することができるようにすることである。
【0017】
【課題を解決するための手段】上記第1の目的を達成す
るため、本発明のプログラム変換装置においては字句・
構文解析時にプログラムのテキスト情報を蓄積してゆ
き、構文解析結果である構文木の各節に保持させるよう
にした。そして、どの構文要素型の節に保持させるかは
ユーザが指定可能にした。
【0018】通常は、構文要素型として構文木のルール
を用いるが、これより小さな要素型を選ぶこともできよ
うにし、テキスト情報は指定された型の構文要素が受理
されたときにその構文要素に付与する。1つの指定構文
要素が受理された後、次の指定構文要素が受理されるま
での間に蓄積されたテキスト情報は、(1)最初の構文
要素、(2)2番目の構文要素、(3)これらの親構文
要素のいずれかで、ユーザが指定したものに保持する。
但し、トップレベルで入力されたコメント情報(全体に
属するコメント情報)は独自管理する。
【0019】また、第2の目的を達成するために、関連
するルールの集まりをルール集合としてまとめ、競合す
るルールを別のルール集合に所属させ、ルール集合毎の
適用順序を制御することにより、ルール適用の競合を制
御するようにした。
【0020】さらに、第3の目的を達成するために、構
文木に型階層を導入し、型を保つルールしか許さないこ
とにし、型毎に変換ルールを分類して保持する。
【0021】また、第4の目的を達成するために、書き
換えルールは、基本的にパターン変数を含んだプログラ
ムパターンの組により記述し、第1のパターンで指定さ
れたプログラム部分を第2のパターンのプログラム部分
に書き換えるようにし、さらに、拡張形式としてルール
に条件部を付加し、ルールの適用に制限を加えることが
できるようにした。
【0022】本発明のプログラム変換装置においては、
書き換えルール及び入力プログラムを字句・構文解析で
解析し構文木を作成し、これらの構文木の(部分木の)
マッチングを試み、マッチした場合にルールに従い構文
木を書き換え、結果からプログラムを作成し出力する。
この時、ルールに条件部が存在する場合には、条件部を
評価し、評価結果が偽であれば、マッチング失敗と同様
に扱う。また、条件部で新たにパターン変数を導入する
ことができ、これは出力パターンで利用することができ
る。これにより動的な一時変数の使用が可能になる。
【0023】マッチングが失敗であったときには、保持
されているテキスト情報を元に結果プログラムを出力す
る。これにより、コメント情報などの損失を防ぐことが
できる。トップレベルのコメントはそのまま元の位置に
出力させる。
【0024】ルール間に競合があるときには、書き換え
戦略の宣言をして書き換え戦略を変更するか、競合があ
るルールを分割して別のルール集合に属するようにする
ことで、明示的に書き換え順序の制御が行える。
【0025】ルールは型毎に分類されて保持されている
ので、入力の構文部分木のノード型に応じて適用可能ル
ールを選択することができ、ルール適用の高速化が図れ
る。
【0026】また、各ルールはノード型を保つため、書
き換えられた出力構文部分も同じ構文型を持つことにな
り、変換後も同じ構文を保つこととなる。
【0027】さらに第5の目的を達成するために、前記
書き換えルールの次のような拡張形式を扱えるようにし
た。
【0028】(1)ルールが適用済みであるかを記録す
る手段を導入し、ルール定義の条件部において、ルール
が適用済みであるかを判定できるようにした。これによ
り、例えばルールがさらに適用可能であるかどうかに関
わらず、一度だけ適用されるようにすることができる。
【0029】(2)プログラムの型検査を行う手段と、
型検査の結果である型情報を格納する手段を導入し、ル
ールの条件部で型情報を参照できるようにした。これに
より、式の型に関する条件を扱えるようになる。
【0030】(3)ルールに付加処理部を付加し、ルー
ル適用の際にパターン変数のマッチ情報を参照・変更・
追加できるようにした。
【0031】(4)プログラムの構文解析装置を2つカ
スケードに接続したものを導入した。ただし、1つは通
常の構文解析装置であるのに対し、もう1つは構文木の
パラメータであるパターン変数の読み換えを行う字句解
析部を有する。これは、例えば、ルール定義で、Expres
sionと宣言されたパターン変数がプログラム断片中に出
現した場合、それをExpressionとして扱うためである。
これによって、ルールの付加的な処理の記述でプログラ
ムの断片を引用することができるようになる。
【0032】
【発明の実施の形態】以下、図面を用いて本発明の実施
形態について説明する。図1は、本発明の一実施形態と
して構成される情報処理システムにおける処理とデータ
の流れを示す概略図である。
【0033】図1において、変換対象の入力プログラム
102とその変換ルール103の構文を、構文木を構成
するノードに型階層を用いた構文解析を行い、入力プロ
グラム102の構文木104および変換ルール103の
構文木(以下、構文木書き換えルールという)105を
作成する構文解析装置101と、入力プログラム102
の構文木を書き換えルール105の構文木で書き換える
構文木書き換え装置106と、書き換えられた入力プロ
グラム102の構文機107を変換されたプログラム1
09として出力する出力処理装置108とを備えてい
る。
【0034】構文木書き換え装置106は、入力プログ
ラム102の構文木104と構文木書き換えルール10
5の構文木とを比較し、書き換えルール105の構文木
の各ノードに当てはまるノードが入力プログラムの構文
木104にあるか否かを調べ、当てはまるノードは書き
換えルール105の構文木で書き換える操作を行うもの
である。
【0035】なお、プログラム102、109変換ルー
ル103は、それぞれフロッピィディスク(FD)をは
じめとする携帯型記憶媒体に格納されていても構わな
い。また、構文解析装置101、構文木書き換え装置1
06出力処理装置108はそれぞれ装置と同様の処理を
行うソフトウェアとして、FD、MO(光磁気ディス
ク)に格納されていても構わない。
【0036】本実施形態では、変換対象とするプログラ
ミング言語としてC言語を選び、構文解析は、標準的な
パーザ生成装置(Lex,Yacc)等の名称で知られ
ている構文解析装置を使用できるので実現が容易であ
る。
【0037】図2に、構文木の書き換えのアルゴリズム
を示している。まず、構文解析装置Parseを呼び、
変換対象のプログラムPの構文木104(TP)を得る
(ステップ301)。次に、構文木104(TP)から
次に書き換えるべき部分木TP’を選択する(ステップ
302)。この選択は書き換えの戦略に依存し、最内書
き換え、最外書き換えなど数種類の戦略が知られている
が、採用する戦略は書き換え戦略の宣言文「#defi
ne_rewrite_strategy」により切り
替えることができる。(デフォルトは最内書き換えを採
用している)。
【0038】書き換えるべき部分木がないときにはT
P’の値として「False」が返るので、終了してT
Pを書き換え結果の構文木として返す(ステップ30
3,311)。
【0039】そうでないときは、TP’に適用できるル
ールの集合を「get_rule」により取り出す(ス
テップ304)。もし、ルールの集合がNILならば
(ステップ305)、ステップ302に戻る。
【0040】「get_rule」は与えられた構文木
のルートノードの型によって適用可能ルール集合を取り
出す関数である。このルール集合の要素であるルールは
(A,B,C)3つの組である。ただし、Aは入力パタ
ーン指定、Bは条件部、Cは出力パターン指定である。
【0041】A,B,C共にC言語の構文で記述する
が、構文中にパターン変数を用いることができ、このパ
ターン変数に関してマッチングとインスタンシエーショ
ンが行われる。
【0042】Aの構文解析結果の構文木TAがTP’と
マッチし、かつ条件部Bが成功するようなルール(のう
ち最初のもの)に対してルールの適用が行われる。ルー
ルの適用はまず、TAとTP’のマッチングからパター
ン変数の変数束縛bindを作成し(ステップ30
6)、この変数束縛のもとで、中間処理指定Bを条件部
評価装置Evalにより評価し、新しい変数束縛「ne
w_bind」を得る(ステップ308)。「bin
d」が「false」であれば(ステップ307)、こ
のルールは適用可能でないので、ステップ305に戻
る。
【0043】「new_bind」により出力パターン
Cの構文木TC内のパターン変数をインスタンシエイト
したものを構成し、TP内の部分木TP’をこれに置き
換える(ステップ310)。中間処理で失敗した場合
は、「new_bind」が「false」になるので
(ステップ309)、ステップ302に戻る。以上の処
理を書き換え可能な部分木TP’がなくなるまで繰り返
す。
【0044】図3に、ルール記述の例を挙げる。パター
ン変数は「@x」のように先頭に「@」を付けて表わ
す。
【0045】図3(a)は、2引数の関数「bar」を
用いて不定個の引数を取り得る関数「foo」を定義す
る例である。
【0046】図3(b)は、文字セットに依存した条件
分岐を専用の関数「islower」に畳み込む例であ
る。
【0047】図3(c)は、オリジナルの仕様のCの関
数定義を最新のANSI対応のプロトタイプつきの定義
に書き換える例である。
【0048】図4〜図6に、変換ルールを適用した場合
のテキスト情報の保存状況を示す。図4は、従来の方式
を適用した場合で、書き換えルールが適用されなかった
プログラムに対してもコメント41〜45情報が失われ
ている。
【0049】図5は、トップレベルの構文木(すなわち
関数定義文または型宣言文)単位にテキスト情報を保持
させた場合で、書き換えを受けた関数定義文では図4と
同じくコメント情報が失われるが、書き換えルールが適
用されなかった2番目の関数定義文についてはテキスト
情報51,52がそのまま保持される。
【0050】図6は、「statement」単位にテ
キスト情報を持たせ、「statement」の間のテ
キスト情報は直前の「statement」に保持させ
るようにした場合である。
【0051】図5の場合と同じく、2番目の関数定義文
についてはテキスト情報61,62がそのまま保持さ
れ、さらに最初の関数定義文についても関数定義本体に
入る前のコメント63は保持されている。
【0052】図7に、条件部を指定したルールの例を示
す。図7(a)はコード移動による最適化に用いた例で
ある。「for」文の終了判定が複雑な表現式である場
合に毎回評価せずに、あらかじめ一度だけ評価を行って
おきその値を動的に生成された一時変数に保持してお
き、終了判定をその変数値で行うように書き換えてい
る。
【0053】複雑な変数値であるかどうかは、「com
plex_expression_p」という判定関数
で判定し、その判定にパスしたときには、書き換えに進
むが、そうでないときには条件部のシステム関数「fa
il」を呼び、マッチング処理自体を失敗させ書き換え
には進まない。また、一時変数はシステム関数「gen
sym」を用いて動的に生成し、他の変数との変数名の
衝突を避けている。
【0054】ここで、「gensym」は文字列を引数
としてとり、その文字列を用いた新しい変数名を生成す
る関数である。例えば、gensym(”work”)
を呼び出すと「work0001」,「work000
2」,...等の変数名を、呼び出す度に新しく生成し
て返す。
【0055】図7(b)は、移植に当たってパス名を変
換する例である。プラットフォームによってはパス名の
長さに制限のある場合がある。このルールではパス名を
使っているコードをパターンマッチでつかまえ、条件部
でパス名の長さを短くする関数「shorten_pa
th_name」を呼び出しこれに書き換えている。
【0056】図8(a)は、型名を引数に取るマクロを
定義する例である。「swap」は第1引数に型名、第
2、第3引数に変数名をとり、それらの変数の値を交換
するマクロである。ここでも、交換用の一時変数を生成
するため、条件部で「gensym」を呼んでいる。
【0057】図8(b)は,制御構造を定義する例であ
る。ここでは表現式とステートメントを受け取り、その
表現式を評価した結果の数だけ、ステートメントを実行
する制御構造「dotimes」を定義している。プロ
グラム中に記述した「dotimesは」、このルール
により「for」文に書き換えてから(コンパイルし)
実行する。但し、「dotimes」という変数名が制
御構造として用いられることを、パーザに教える必要が
あるため、ルール定義の前に「#declare_co
ntrol_stmt」文で宣言を行っている。
【0058】図9〜図11は、競合制御を行う例であ
る。2つのルールには競合があり、例えば表現式「fo
o(bar(x))」にはどちらのルールも適用できる
ため適用順序により変換結果がことなる。図9は、「#
define_rewrite_stragy」宣言で
「innermost」(最内書き換え)を指定した場
合で、表現式「foo(bar(x))」の内側の書き
換え候補「bar(x)」の方が先に書き換えられるた
め、結果は「foo(bar(x))」となる。なお、
書き換えのデフォルトは「innermost」として
いるので、宣言を何も行わない場合には、この書き換え
が実行される。
【0059】図10は、「#define_rewri
te_stragy」宣言で「outermost」
(最外書き換え)を指定した場合で、表現式「foo
(bar(x))」が外側から書き換えられ、結果は
「foobar(x)」となる。
【0060】図11は、ルール集合1,2の分割を用い
た制御方法を示している。2つのルール1,2を分割し
てそれぞれの別のルール集合とすることで、適用順序を
明示的に指定することができる。
【0061】(発明の第2の実施形態)本発明の第2の
実施形態について説明する。第2の実施形態は、基本的
には第1の実施形態と同様であるが、図1のブロック構
成図において構文木書換え装置106を図12のブロッ
ク図に示すように、パターンマッチ装置110、マッチ
情報111、書換え条件判定装置112、書換え結果生
成装置113、適用済みルール記録装置114から構成
したものである。
【0062】パターンマッチ装置110は、図2のフロ
ーチャートのステップ301から307までを処理する
ものである。書換え条件判定装置112は、ステップ3
08から309までを処理するものである。書換え結果
生成装置113はステップ310を処理するものであ
る。マッチ情報111はステップ306あるいはステッ
プ308で生成されるパターン変数の変数束縛bind
あるいはnew_bindである。以上は第1の実施形
態と同様である。
【0063】本実施形態では、さらに、図2のステップ
310での処理の後、適用された書換えルールが、適用
済みルール記録装置114に記録される。この記録は、
書換えルールの条件部で参照することができる。これに
より、既に一度適用されたのであれば、適用しないよう
な書換えルールを作成することができる。
【0064】(発明の第3の実施形態)本発明の第3の
実施形態について説明する。第3の実施形態は、基本的
には第1の実施形態と同様であるが、図1のブロック構
成図で構文木書換え装置106を図13のブロック図に
示すように、パターンマッチ装置110、マッチ情報1
11、書換え条件判定装置112、書換え結果生成装置
113、型検査装置115、型情報116から構成した
ものである。基本的な処理のフローチャートも図2と同
様である。
【0065】本実施形態ではさらに、図2のステップ3
07と308の間に型検査のステップが型検査装置11
5によって実行される。この型検査のステップによって
得られた型情報116は書換えルールの条件部で参照す
ることができる。これにより、書換えの条件として、プ
ログラムの型情報を用いた書換えルールを作成すること
が可能になる。
【0066】図14(a)は、第2、第3の両実施形態
を同時に実施した場合に可能となる書換えルールの例で
ある。この書換えルールは、例えばプログラムのデバッ
グの目的で、プログラムの実行中に特に文字列の変数の
内容を表示させるように、プログラムを書き換えるため
のものである。文字列の変数に対する代入文があれば、
その代入文の直後にその変数を表示させるプリント文1
41を挿入する。
【0067】この書換えルールは一度適用された場合、
それ以上の適用は行ってはならない。プリント文が際限
なく挿入されてしまうためである。そのため、条件部に
おいて、第2の実施形態の適用済みルール記録装置11
4の情報を関数「 applied()」によって参照し、既に適
用されていれば、ルールの適用が失敗するようになって
いる。
【0068】また、変数を表示させるプリント文は変数
の型ごとに異なるため、ここでは文字列型の変数の場合
のみを扱っている。条件部では、変数の型を、第3の実
施形態で得られる型情報116を関数「 type_of()」に
よって調べ文字列型(char *)でなければ、ルールの適用
が失敗するようになっている。図14(b)がデバッグ
前、図14(c)がデバッグ後を示している。
【0069】(発明の第4の実施形態)本発明の第4の
実施形態について説明する。第4の実施形態は、基本的
には第1の実施形態と同様であるが、図1のブロック構
成図で構文木書換え装置106を図15のブロック図に
示すように、パターンマッチ装置110、マッチ情報1
11、書換え条件判定装置112、書換え結果生成装置
113、付加処理装置117から構成したものである。
基本的な処理のフローチャートも図2と同様である。
【0070】本実施形態では、さらに、書換えルールの
記述の形式が拡張され、パターン変数の変数束縛を参照
・追加・変更が可能な付加処理部が付加される。また、
図2のステップ309と310との間に、付加処理装置
117によって付加処理部が実行されるステップが挿入
される。この付加処理のステップによって得られたパタ
ーン変数の変数束縛が改めてnew_bindとなり、
ステップ310で使用される。
【0071】このような付加処理は条件部でも記述可能
である。しかし、条件判定とは関係ない処理や、条件判
定後に行うべき処理を、付加処理部に記述することによ
り、書換えルールの構造を明確にすることができる。
【0072】(発明の第5の実施形態)本発明の第5の
実施形態について説明する。第5の実施形態は、基本的
には第1の実施形態と同様であるが、図1のブロック構
成図で構文解析装置101を図16のブロック図に示す
ように、字句解析装置(1)118、字句解析装置
(2)119、字句バッファ120、構文解析装置
(1)121、構文解析装置(2)122から構成した
ものである。基本的な処理のフローチャートも図2と同
様である。
【0073】図16から字句解析装置(2)119、構
文解析装置(2)122を除けば、通常の構文解析装置
となる。プログラムの構文解析は、字句解析装置(2)
119、構文解析装置(2)122を使わずに第1の実
施形態と同様に行われる。また、変換ルールの構文解析
についても、これまで挙げてきたルール例に関しては、
字句解析装置(2)119、構文解析装置(2)122
を使わずに構文解析される。
【0074】本実施形態では、さらに変換ルールの記述
形式を拡張し、付加処理部において、プログラムの断片
を引用し、パターン変数の束縛の変更・追加に利用する
ことができるようにしてある。このプログラムの断片を
引用部分を構文解析する際に字句解析装置(2)11
9、構文解析装置(2)122が使用される。
【0075】プログラム断片の引用部分がある変換ルー
ルを構文解析する際には、プログラム断片の引用部分が
現れるまでは、字句解析装置(1)118、字句バッフ
ァ120、構文解析装置(1)121によって通常の処
理が行われる。プログラム断片の引用部分が現れた時点
で構文解析装置(1)121は、制御を構文解析装置
(2)122に移す。構文解析装置(2)122はプロ
グラム断片の引用部分が終了するまで、構文解析を進
め、得られたプログラム断片の構文木を字句として字句
バッファ120に格納し、構文解析装置(1)121に
制御を戻す。構文解析装置(1)121は、字句バッフ
ァ120からプログラム断片の構文木を字句として取得
し、通常の構文解析を進めることができる。
【0076】構文解析装置(2)122がプログラム断
片の引用を構文解析している間、字句解析装置(1)1
18で得られた字句は更に字句解析装置(2)119を
通して字句バッファ120に格納される。字句解析装置
(2)119は例えば、「expr @x 」と宣言されたパタ
ーン変数@xが現れた場合に、単なるパターン変数ではな
くEXPR_PATTERNという字句に置き換える。字句EXPR_PAT
TERNが現れるとexprであると認識するように構文を定義
しておくことにより、@xをexprとして認識することがで
きる。
【0077】図17は、第4、第5の両実施形態を同時
に実施した場合に可能となる書換えルールの例である。
このルールは図3(c)に示したCの関数定義を書換え
るルールと同様の処理を行うためのものである。図3
(c)では、条件部で特別な関数「make_arg_decls()」
で行っていた処理を図17では枠171で囲まれた付加
処理部で行っている。この付加処理部では、第1の下線
部172で示したプログラム断片により、空の新しい引
数のリスト「 new_args」を作成し、その後、元の引数
のリストの要素を1つづつたどりながら、第2の下線部
173で示したプログラム断片の引用により、対応する
引数の宣言を新しく作成し、「new_args」に追加してい
る。このように付加処理部と、プログラム断片の引用を
導入することにより、特別な関数を使用することなく、
複雑な書換えルールを容易に定義することができる。
【0078】
【発明の効果】以上説明したように本発明によれば、プ
ログラム作成過程におけるコメント情報等のテキスト情
報の損失を最小限にとどめ、くプログラム変換を行うこ
とができることができる。特に、トップレベルのコメン
ト情報はそのまま保持することができる。また、書き換
えの戦略指定とルール集合の概念により、ルール間の競
合制御が容易に行え、ルール自体を書き換えることなく
ルールの適用順序を変更することができる。さらに、各
書き換えが構文を保つために変換における構文的安全性
が確保される。さらにまた、ルールに条件部があるた
め、ルール成立のための付帯条件、一時変数の導入が行
え、さらに制御構造の定義を行い、特定の文字列のみに
変換を施すなどの制御が可能になる。従って、このよう
な書き換えルールを用意することで、プログラムの移
植、修正、開発、管理等に利用でき、さらに書き換えル
ールを蓄積していくことでソフトウェア開発の能率を向
上させることができる。
【0079】また、ルールが適用済みであるかを記録す
る手段があり、ルール定義の条件部において、ルールが
適用済みであるかを判定できるため、ルールがさらに適
用可能であるかどうかに関わらず、一度だけ適用される
ようにすることができる。さらに、条件部で型情報を参
照できるため、式の型に関する条件をルールの制御に用
いることができる。また、ルールに付加処理部があるた
め、ルールの構造を明確化できる。さらに、ルールの付
加処理部でプログラムの断片を引用することができる等
の効果が得られる。
【図面の簡単な説明】
【図1】本発明の実施形態を示すブロック構成図であ
る。
【図2】構文木の書き換えアルゴリズムを示すフローチ
ャートである。
【図3】書き換えルールの記述例を示す図である。
【図4】書き換えルールが適用されなかった場合のテキ
スト情報の保存状況を示す図である。
【図5】トップレベルの構文木単位にテキスト情報が保
存される例を示す図である。
【図6】ステートメント単位にテキスト情報を保存する
例を示す図である。
【図7】コード移動による最適化に用いた例および移植
に当たってパス名を変換する例を示す図である。
【図8】型名を引数にとるマクロを定義する例および制
御構造を定義する例を示す図である。
【図9】競合制御を行う場合で、最内書き換えを指定し
た時の変換結果を示す図である。
【図10】競合制御を行う場合で、最外書き換えを指定
した時の変換結果を示す図である。
【図11】ルール集合の分割を用いた制御例を示す図で
ある。
【図12】第2の実施形態の構文木書換え装置106の
詳細ブロック図である。
【図13】第3の実施形態の構文木書換え装置106の
詳細ブロック図である。
【図14】第2、第3の実施形態に対する変換ルール例
を示す図である。
【図15】第4の実施形態の構文木書換え装置106の
詳細ブロック図である。
【図16】第5の実施形態の構文解析装置101の詳細
ブロック図である。
【図17】第4、第5の実施形態に対する変換ルール例
を示す図である。
【符号の説明】
101…構文解析装置、102…変換対象の入力プログ
ラム、103…変換ルール、104…構文木、105…
構文木書き換えルール、106…構文木書き換え装置、
107…書き換えられた構文木、108…出力処理装
置、109…変換されたプログラム、110…パターン
マッチ装置、111…マッチ情報、112…書換え条件
判定装置、113…書換え結果生成装置、114…適用
済みルール記録装置、115…型検査装置、116…型
情報、117…付加処理装置、118…字句解析装置
(1)、119…字句解析装置(2)、120…字句バ
ッファ、121…構文解析装置(1)、122…構文解
析装置(2)。

Claims (9)

    【特許請求の範囲】
  1. 【請求項1】 変換対象の入力プログラムとその変換ル
    ールの構文を、構文木を構成するノードに型階層を用い
    た構文解析を行い、入力プログラムの構文木および変換
    ルールの構文木を作成する構文解析手段と、 前記入力プログラムの構文木を前記変換ルールの構文木
    で書き換える構文木書き換え手段と、 書き換えられた入力プログラムの構文木を変換されたプ
    ログラムとして出力する手段とを備え、 前記構文解析手段は、字句・構文解析時に入力プログラ
    ムのテキスト情報を蓄積してゆき、構文解析結果である
    構文木の各節に保持させることを特徴とするプログラム
    変換装置。
  2. 【請求項2】 前記構文木書き換え手段は、関連する変
    換ルールの集まりをルール集合としてまとめ、競合する
    変換ルールを別の変換ルール集合に所属させ、変換ルー
    ル集合毎の適用順序を制御することを特徴とする請求項
    1記載のプログラム変換装置。
  3. 【請求項3】 前記構文木書き換え手段は、型階層を保
    つ変換ルールのみの適用を許すことを特徴とする請求項
    1記載のプログラム変換装置。
  4. 【請求項4】 前記変換ルールに、ルール適用の条件指
    定部を付加したことを特徴とする請求項1記載のプログ
    ラム変換装置。
  5. 【請求項5】 前記構文木書換え手段は、適用済みルー
    ルを記録する手段を有することを特徴とする請求項4記
    載のプログラム変換装置。
  6. 【請求項6】 前記構文木書換え手段は、プログラムの
    型検査を行う手段と、型検査の結果である型情報を格納
    する手段を有することを特徴とする請求項4記載のプロ
    グラム変換装置。
  7. 【請求項7】 前記変換ルールにルール適用の付加処理
    を付加し、かつ前記構文木書換え手段は該付加処理を実
    行する付加処理手段を有することを特徴とする請求項4
    記載のプログラム変化装置。
  8. 【請求項8】 前記構文解析手段の後段に、さらに変換
    ルール中にある構文木のパラメータの読み換えを行う字
    句解析部を有する構文解析手段を接続したことを特徴と
    する請求項4記載のプログラム変換装置。
  9. 【請求項9】 変換対象の入力プログラムとその変換ル
    ールの構文を、構文木を構成するノードに型階層を用い
    た構文解析を行い、入力プログラムの構文木および変換
    ルールの構文木を作成する構文解析処理を行う処理と、 前記入力プログラムの構文木を前記変換ルールの構文木
    で書き換える構文木書き換え処理を行う処理と、 書き換えられた入力プログラムの構文木を変換されたプ
    ログラムとして出力する処理を行う処理と、 前記構文解析処理を行うステップは、字句・構文解析時
    に入力プログラムのテキスト情報を蓄積してゆき、構文
    解析結果である構文木の各節に保持させる処理と、をコ
    ンピュータに実行させる命令を含むプログラムを格納し
    たコンピュータが読み取り可能な記憶媒体。
JP9247940A 1996-09-30 1997-09-12 プログラム変換装置および記憶媒体 Pending JPH10154079A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP9247940A JPH10154079A (ja) 1996-09-30 1997-09-12 プログラム変換装置および記憶媒体

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
JP8-258370 1996-09-30
JP25837096 1996-09-30
JP9247940A JPH10154079A (ja) 1996-09-30 1997-09-12 プログラム変換装置および記憶媒体

Publications (1)

Publication Number Publication Date
JPH10154079A true JPH10154079A (ja) 1998-06-09

Family

ID=26538492

Family Applications (1)

Application Number Title Priority Date Filing Date
JP9247940A Pending JPH10154079A (ja) 1996-09-30 1997-09-12 プログラム変換装置および記憶媒体

Country Status (1)

Country Link
JP (1) JPH10154079A (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9710243B2 (en) 2013-11-07 2017-07-18 Eagle Legacy Modernization, LLC Parser that uses a reflection technique to build a program semantic tree
CN114791812A (zh) * 2022-04-07 2022-07-26 中国平安人寿保险股份有限公司 Plsql代码的java转换方法、装置、电子设备及存储介质
WO2022234675A1 (ja) * 2021-05-07 2022-11-10 日本電信電話株式会社 プログラム修正装置、プログラム修正方法及びプログラム

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9710243B2 (en) 2013-11-07 2017-07-18 Eagle Legacy Modernization, LLC Parser that uses a reflection technique to build a program semantic tree
WO2022234675A1 (ja) * 2021-05-07 2022-11-10 日本電信電話株式会社 プログラム修正装置、プログラム修正方法及びプログラム
CN114791812A (zh) * 2022-04-07 2022-07-26 中国平安人寿保险股份有限公司 Plsql代码的java转换方法、装置、电子设备及存储介质

Similar Documents

Publication Publication Date Title
CN100385399C (zh) 用于多个异常处理模型的中间表示的方法和系统
JP4057938B2 (ja) コンパイラ、コンパイル方法、及びプログラム開発ツール
US9535664B1 (en) Computerized software development process and management environment
US20100325608A1 (en) Generation of parallel code representations
US20020019973A1 (en) Compiler and method for compiling easily adaptable to processor specifications
JP2005141380A (ja) テンプレートコンパイル方法
KR102614967B1 (ko) 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법
Overbey et al. Generating rewritable abstract syntax trees: A foundation for the rapid development of source code transformation tools
Economopoulos et al. Faster scannerless GLR parsing
Zambon et al. Recipes for coffee: Compositional construction of JAVA control flow graphs in GROOVE
GB2420638A (en) Method of substituting code fragments in Internal Representation
CN114329492A (zh) 一种针对Go语言链码的漏洞检测方法
Simão A language for the description of program instrumentation and automatic generation of instrumenters
Lilis et al. Meta C++: an extension layer for multi-stage generative metaprogramming.
Lam Practical Performance Enhancements to the Evaluation Model of the Hazel Programming Environment
KR100276086B1 (ko) 로토스 명세로부터 씨 플러스 플러스 코드 생성방법
Ljungren Evaluation of Clang Tools for Information Extraction
JP2001005655A (ja) アプリケーションジェネレータ開発支援装置及びアプリケーションジェネレータ開発支援方法
Jakumeit et al. The GrGen .NET User Manual
Bransen On the Incremental Evaluation of Higher-Order Attribute Grammars
Börger et al. Dynamic Sequential Step Control
JP2004246924A (ja) アプリケーションジェネレータ開発支援装置及びアプリケーションジェネレータ開発支援方法
JPH08272622A (ja) プログラム変換装置
Zambon et al. Recipes for Coffee: Compositional
Passerone et al. Generation of minimal size code for schedule graphs