JP3430252B2 - ソースコード変換方法、ソースコード変換プログラムを記録した記録媒体及びソースコード変換装置 - Google Patents

ソースコード変換方法、ソースコード変換プログラムを記録した記録媒体及びソースコード変換装置

Info

Publication number
JP3430252B2
JP3430252B2 JP2000015021A JP2000015021A JP3430252B2 JP 3430252 B2 JP3430252 B2 JP 3430252B2 JP 2000015021 A JP2000015021 A JP 2000015021A JP 2000015021 A JP2000015021 A JP 2000015021A JP 3430252 B2 JP3430252 B2 JP 3430252B2
Authority
JP
Japan
Prior art keywords
expression
sentence
output
source code
abstract syntax
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.)
Expired - Lifetime
Application number
JP2000015021A
Other languages
English (en)
Other versions
JP2001209547A (ja
Inventor
裕志 一杉
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.)
National Institute of Advanced Industrial Science and Technology AIST
Original Assignee
National Institute of Advanced Industrial Science and Technology AIST
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 National Institute of Advanced Industrial Science and Technology AIST filed Critical National Institute of Advanced Industrial Science and Technology AIST
Priority to JP2000015021A priority Critical patent/JP3430252B2/ja
Priority to US09/531,938 priority patent/US6516461B1/en
Publication of JP2001209547A publication Critical patent/JP2001209547A/ja
Application granted granted Critical
Publication of JP3430252B2 publication Critical patent/JP3430252B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/51Source to source

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、ソースコード変換
方法、ソースコード変換プログラムを記録した記録媒体
及びソースコード変換装置に係り、特に、コンパイラ、
プリプロセッサ、拡張可能プログラミング言語処理系、
ソースコード解析ツール、ソースコード変換ツール等に
用いることができるソースコード変換方法、ソースコー
ド変換プログラムを記録した記録媒体及びソースコード
変換装置に関する。
【0002】
【従来の技術】(1)用語概説 まず、用語について概説する。 ・抽象構文木(abstract syntax tree) 構造化プログラミング言語の内部表現。ソースコードを
抽象構文木の形で表現することで、ソースコードを文字
列として扱うよりも、解析・変換処理が容易になる。 ・式 (Expression) C 言語、 Java 言語などでは文法上、定数、変数、演算
子、代入式などは「式」として定義されている。2項演
算子の左辺・右辺も「式」である。 ・文(Statement) C 言語、 Java 言語などでは、文法上、 if 文、 while
文、複合文などは「文」として定義されている。 ・式文 (ExpressionStatement) C, Java 言語などの仕様書で使われている用語。式にセ
ミコロン ";" をつけたものは、 式文と呼ばれる。式文
は、文法的には文の1つとして定義されている。
【0003】・区切り記号(separator) 式につけて、文のように扱うことができるようにするた
めの記号。C, C++, Java 言語などでは、例えば ";" が
区切り記号として使われている。 ・バッククォートマクロ(backquote macro) プログラム中からプログラム自身を操作する能力を持っ
たプログラミング言語において、プログラム自身と、対
象とするプログラムとを区別するための構文。例えば l
isp 言語において、 (+ x 1) は、「 x に 1 を足す」
ということを意味するプログラムだが、このプログラム
自身を lisp プログラム中で表現するためには、 `(+ x
1) という表現を用いる。バッククォートで書かれたプ
ログラムコードの内部に、直接、値を埋め込むこともで
きる。例えば lisp において `(+x 2 ,(+ y 1)) は、 y
の値が 1 だった場合は、`(+ x 2) というプログラム
コードを意味する。 ・サブツリー(subtree) 部分木のこと。
【0004】(2)従来技術 つぎに、ソースコード変換プログラムの従来技術につい
て説明する。C 言語などのプログラミング言語を用いて
書かれたソースコードを処理対象とするソースコード変
換プログラムの従来技術について、まず説明する。
【0005】ソースコード変換プログラムとは、ソース
コードに対してなんらかの変換処理を行ない、同一また
は異なるプログラム言語のソースコードを出力する、プ
ログラムである。ソースコード変換プログラムは、プリ
プロセッサとも呼ばれる。ソースコード変換プログラム
は一般に、ソースコードを構文解析し、変換処理しやす
い内部表現に変換する。多くの場合、この内部表現は、
木構造をしており、これは抽象構文木と呼ばれる。従来
技術では、式文を含むソースコードを抽象構文木で表現
する場合、式文を表すノードを用いて素直に表現してい
た。ここで式文とは、例えば C 言語では式の後ろに
";" を付加したもののことを言う。
【0006】式文について、もう少し詳しく説明する。
C 言語や、 C 言語に類似した文法を持つ C++ 言語や J
ava 言語などでは、文と式が文法上区別されている。例
えば "x", "0", "x + 1", "x = 0" などはそれぞれ式で
あり、if 文、 while 文などは文である。C 言語では式
の後ろに ";" を付加したものは、一般に文とみなされ
る。これを式文と呼ぶ。例えば、 "x = 0;" は式文であ
り、これは文とみなされる。
【0007】従来技術を説明するために、具体例とし
て、文法が BNF(Backus-Naur Form)によって次のように
定義される、簡単な言語について考える。 文 ::= if文 | 式文 if文 ::= if ( 式 ) 文 else 文 式文 ::= 式 ; 式 ::= 等号比較 | 代入 | 変数 | 定数 等号比較 ::= 式 == 式 代入 ::= 式 = 式
【0008】図1は、従来技術における表現を用いた抽
象構文木の図である。この図は、このような言語で書か
れたプログラム if (x == 0) y = 0; else y = 1; を、従来技術によって抽象構文木で表現したものであ
る。
【0009】図2〜図6は、従来技術を用いて、抽象構
文木を文字列に変換して出力する再帰的アルゴリズムを
示したものである。図2は、従来技術における抽象構文
木を文字列に変換して出力する手続きのフローチャート
である。図3は、従来技術におけるif文を出力する手続
きのフローチャートである。図4は、従来技術における
式文を出力する手続きのフローチャートである。図5
は、従来技術における等号比較を出力する手続きのフロ
ーチャートである。図6は、従来技術における代入を出
力する手続きのフローチャートである。図1の抽象構文
木を出力する場合を例にとって、出力手順を以下に説明
する。
【0010】まず、図2の「抽象構文木を出力する手続
き」を呼び出す。処理対象の抽象構文木は図1のT11
である。図2の手続きは、処理対象の抽象構文木の ル
ートノードの種類によって分岐を行なう。抽象構文木T
11の ルートノードの種類は if 文なので、分岐して
「if 文を出力する手続き」を呼び出す(ステップS2
1)。
【0011】図3の「if 文を出力する手続き」におい
ては、まず文字列 "if (" を出力し(ステップS3
1)、1番目のサブツリーの内容である "x == 0" を出
力するために図2の「抽象構文木を出力する手続き」を
再帰的に呼び出し(ステップS32)、文字列 ")" を
出力し(ステップS33)、2番目のサブツリーの内容
である "y = 0;" を出力するために図2の「抽象構文木
を出力する手続き」を再帰的に呼び出し(ステップS3
4)、文字列 " else " を出力し(ステップS35)、
3番目のサブツリーの内容である "y = 1;" を出力する
ために図2の「抽象構文木を出力する手続き」を再帰的
に呼び出し(ステップS36)、図3の手続きを終了し
て呼び出し元に戻る。
【0012】以上のような再帰的に呼び出すステップS
32、S34、S36について、以下に説明する。ここ
では、一例として、ステップS36の "y = 1;" の出力
手順について、さらに詳細に説明する(なお、ステップ
S32の "x == 0" の出力手順と、ステップS34の "
y = 0;" の出力手順の詳細な説明は省略するが、ステッ
プS36と同様に再帰的に行なわれる)。ステップS3
6は、図2の「抽象構文木を出力する手続き」を再帰的
に呼び出す。ここで、処理対象の抽象構文木はT12と
する。処理対象の抽象構文木の ルートノードの種類は
式文なので、分岐して「式文を出力する手続き」を呼び
出す(ステップS22)。
【0013】図4の「式文を出力する手続き」において
は、サブツリーの内容である "y =1" を出力するために
図2の「抽象構文木を出力する手続き」を再帰的に呼び
出し(ステップS41)、文字列 ";" を出力し(ステ
ップS42)、図4の手続きを終了して呼び出し元に戻
る。ここで、再帰的に呼び出すステップS41の "y =
1" の出力手順について、さらに詳細に説明する。ステ
ップS41は、図2の「抽象構文木を出力する手続き」
を再帰的に呼び出す。ここで、処理対象の抽象構文木は
T13とする。処理対象の抽象構文木の ルートノード
の種類は代入なので、分岐して「代入を出力する手続
き」を呼び出す(ステップS24)。
【0014】図6の「代入を出力する手続き」において
は、1番目のサブツリーの内容である "y" を出力する
ために図2の「抽象構文木を出力する手続き」をさらに
再帰的に呼び出し(ステップS61)、文字列 " = "
を出力し(ステップS62)、2番目のサブツリーの内
容である "1" を出力するために図2の「抽象構文木を
出力する手続き」を再帰的に呼び出し(ステップS6
3)、図6の手続きを終了して呼び出し元に戻る。さら
に再帰的に呼び出すステップS61の "y" の出力手順
について、さらに詳細に説明する。ステップS61は、
図2の「抽象構文木を出力する手続き」を再帰的に呼び
出す。ここで、処理対象の抽象構文木はT14とする。
処理対象の抽象構文木の ルートノードの種類は変数な
ので、分岐して変数名 "y" を出力し(ステップS2
5)、図2の手続きを終了して呼び出し元である図6に
戻る。また、さらに再帰的に呼び出すステップS63の
"1" の出力手順について、さらに詳細に説明する。ス
テップS61は、図2の「抽象構文木を出力する手続
き」を再帰的に呼び出す。ここで、処理対象の抽象構文
木はT15とする。処理対象の抽象構文木の ルートノ
ードの種類は定数なので、分岐して定数名 "1" を出力
し(ステップS25)、図2の手続きを終了して呼び出
し元である図6に戻る。
【0015】以上のような再帰的な処理により、図1の
抽象構文木T11は、文字列 "if (x == 0) y = 0; els
e y = 1;" として出力される。
【0016】
【発明が解決しようとする課題】従来技術のように、抽
象構文木において式文を表すノードを用いた内部表現を
行なうと、ソースコード変換プログラムの処理が繁雑に
なるという課題と、バッククォートマクロの記述が繁雑
になるという課題が生じる。これら2つの課題につい
て、以下に具体的に説明する。
【0017】まず従来技術の1つ目の課題について説明
する。ソースコード変換プログラムは、入力プログラム
を構文解析して抽象構文木という形の内部表現にし、そ
の抽象構文木に対して変換処理を行ない、最終的に抽象
構文木を文字列に戻して出力する。ここで、抽象構文木
に対する変換処理をプログラミングする際に、プログラ
マーは文と式との区別を常に意識しなければならない、
という課題があった。例えば、プログラマーが、文と式
との区別を間違えて、文があるべき場所に式があるよう
な抽象構文木を作ってしまったとする。図7は、そのよ
うな抽象構文木の例を示す図である(なお、これが、後
述するように本発明における表現を用いた抽象構文木の
図でもある)。if 文の2番目と3番目のサブツリーは
本来、文であるべきだが、図7の抽象構文木では式の一
種である代入を表すサブツリーになっている。この抽象
構文木を従来技術の図2〜図6を使って文字列として出
力すると、このように、区切り記号 ";" の足りない、
誤ったプログラムになってしまう。 if (x == 0) y = 0 else y = 1
【0018】同様に、誤って式文のサブツリーに文が来
るような抽象構文木を作ってしまうと、このように区切
り記号 ";" が2重についた誤ったプログラムになって
しまう。 if (x == 0) y = 0;; else y = 1;; このような誤ったプログラムを出力してしまわないよう
に、ソースコード変換プログラムを書くプログラマー
は、文と式との違いに注意して抽象構文木を処理しなけ
ればならず、プログラム作成が繁雑であった。
【0019】次に従来技術の2つ目の課題について説明
する。例えば、lisp 言語は、バッククォートマクロと
いう機能を持っている(バッククォートマクロは、 qua
siquote とも呼ばれている)。バッククォートマクロと
は、プログラム自身をデータとして扱い、そのプログラ
ム言語自身を使って操作する際に必要となる機能であ
る。これは、lisp 言語におけるバッククォートマクロ
を用いた記述例である。 `(if condition ,exp1 ,exp2)
【0020】このバッククォートマクロの機能を C 言
語上に追加したシステムがいくつか存在するが、いずれ
も、記述が lisp 言語の場合ほど簡単にはならない、と
いう課題がある。これは、 lisp の場合、文法上すべて
の構文要素が式であるために簡単な記述で済んだが、C
言語の場合、式と文とが区別されていることが原因で、
簡単にはならない。そのため、例えば、バッククォート
マクロを用いた記述は次のようになる。 `[Statement]{if (condition) ,[Expression]exp1; ,[E
xpression]exp2;}
【0021】バッククォートマクロが正しく構文解析で
きるようにするために、開始時点での非終端記号(この
場合は Statement)と、値を埋め込む時点での非終端記
号(この場合は Expression)とを指定しなければなら
ないからである。このようにプログラマーにとって繁雑
な記述になってしまい、バッククォートマクロの実用性
が低くなる、という課題があった。
【0022】本発明では、以上のようなソースコード変
換処理およびバッククォートマクロ記述の際などの従来
の課題に鑑み、式文を表すノードを用いずに抽象構文木
を表現し、このような抽象構文木を文字列に変換するソ
ースコード変換方法を提供することを目的とする。さら
に、本発明は、以下を達成することを目的とする。 1 抽象構文木を作る際に式と文との区別をしないで済
むようにし、ソースコード変換プログラムの実装を容易
にする。 2 バッククォートマクロのシンタックスを簡単にす
る。例えばlisp 言語におけるバッククォートマクロを
用いた記述 `(if condition ,exp1 ,exp2) に相当するものが、 C 言語では `{if (condition) ,exp1; ,exp2;} というように書けるようにする。このように、従来技術
のように文と式との区別をプログラマーが書く必要をな
くし、非常に記述しやすくする。
【0023】
【課題を解決するための手段】本発明の第1の解決手段
によると、文と式とが文法的に区別されていること、式
に区切り記号を加えた式文が文の1つとして定義されて
いること、構文ごとにそれが式であるか文であるかが決
まっていること、及び、構文ごとにその構文を構成する
各部分が式か文かを判断可能になっていること、という
条件を満たすプログラミング言語で表現された入力ソー
スコードを、同一又は異なる言語で表現された出力ソー
スコードへ変換するソースコード変換方法であって、入
力ソースコードが、式文を表す区切り記号に対応するノ
ードを用いずに表現された抽象構文木を、出力ソースコ
ードとして出力するため、抽象構文木を文として出力す
るステップと、抽象構文木を式として出力するステップ
と、各構文を出力するステップを含み、前記抽象構文木
を文として出力するステップは、出力しようとする抽象
構文木のルートノードの種類に従い、ルートノードが文
を表すノードである場合は、その文の種類に応じて、各
構文を出力し、ルートノードが式を表すノードである場
合は、抽象構文木を式として出力し、その後、式文を表
す区切り記号を出力するようにし、前記抽象構文木を式
として出力するステップは、出力しようとする抽象構文
木のルートノードの種類に従い、その式の種類に応じ
て、各構文を出力するようにしたソースコード変換方法
を提供する。
【0024】本発明の第2の解決手段によると、コンピ
ュータに、文と式とが文法的に区別されていること、式
に区切り記号を加えた式文が文の1つとして定義されて
いること、構文ごとにそれが式であるか文であるかが決
まっていること、及び、構文ごとにその構文を構成する
各部分が式か文かを判断可能になっていること、という
条件を満たすプログラミング言語で表現された入力ソー
スコードを、同一又は異なる言語で表現された出力ソー
スコードへ変換させるためのソースコード変換プログラ
ムを記録したコンピュータ読み取り可能な記録媒体であ
って、入力ソースコードが、式文を表す区切り記号に対
応するノードを用いずに表現された抽象構文木を、出力
ソースコードとして出力するため、抽象構文木を文とし
て出力するステップと、抽象構文木を式として出力する
ステップと、各構文を出力するステップをコンピュータ
に実行させ、前記抽象構文木を文として出力するステッ
プは、コンピュータが、出力しようとする抽象構文木の
ルートノードの種類に従い、ルートノードが文を表すノ
ードである場合は、その文の種類に応じて、各構文を出
力し、ルートノードが式を表すノードである場合は、抽
象構文木を式として出力し、その後、式文を表す区切り
記号を出力するようにし、前記抽象構文木を式として出
力するステップは、コンピュータが、出力しようとする
抽象構文木のルートノードの種類に従い、その式の種類
に応じて、各構文を出力するようにしたソースコード変
換プログラムを記録したコンピュータ読み取り可能な
録媒体を提供する。
【0025】本発明の第3の解決手段によると、文と式
とが文法的に区別されていること、式に区切り記号を加
えた式文が文の1つとして定義されていること、構文ご
とにそれが式であるか文であるかが決まっていること、
及び、構文ごとにその構文を構成する各部分が式か文か
を判断可能になっていること、という条件を満たすプロ
グラミング言語で表現された入力ソースコードを、同一
又は異なる言語で表現された出力ソースコードへ変換す
るソースコード変換装置であって、入力ソースコード
が、式文を表す区切り記号に対応するノードを用いずに
表現された抽象構文木を、出力ソースコードとして出力
するため、抽象構文木を文として出力する手段と、抽象
構文木を式として出力する手段と、各構文を出力する手
段を含み、前記抽象構文木を文として出力する手段は、
出力しようとする抽象構文木のルートノードの種類に従
い、ルートノードが文を表すノードである場合は、その
文の種類に応じて、各構文を出力し、ルートノードが式
を表すノードである場合は、抽象構文木を式として出力
し、その後、式文を表す区切り記号を出力するように
し、前記抽象構文木を式として出力する手段は、出力し
ようとする抽象構文木のルートノードの種類に従い、そ
の式の種類に応じて、各構文を出力するようにしたソー
スコード変換装置を提供する。
【0026】
【発明の実施の形態】本発明が適用できるプログラミン
グ言語は、以下の条件を満たしているものとする。 ・文と式とが文法的に区別されている。 ・式に区切り記号を加えた「式文」が文の1つとして定
義されている。(例えばC 言語の文法においては ";"
が区切り記号であり、式に ";" をつけた式文が文の1
つとして定義されている。) ・構文ごとに、それが式であるか文であるかが決まって
いる。(例えば C 言語の if文は常に文であり、1+2 は
常に式である。同じ構文が文脈によって式になったり文
になったりすることはない。) ・構文ごとに、その構文を構成する各部分が式が文かを
判断可能になっている。(例えば、 C 言語の if文は、
条件式、 then 部、 else 部の3つの部分からなってい
るが、条件式は必ず式であり、then 部と else 部は必
ず文である。)このような性質を持つプログラミング言
語のソースコードを、本発明では、式文を表すノードを
使わず表現する。式文を表現するには、その式文が有す
る式を表す抽象構文木そのものを用いて表現する。
【0027】本発明による、式文を用いずに表現された
抽象構文木を、文字列として出力するためのアルゴリズ
ムは、一般的には以下のようになる。手続きは、 ・ Ps : 抽象構文木を文として出力する手続き ・ Pe : 抽象構文木を式として出力する手続き ・ Pi(i=0,1,...) : 各構文(if 文、代入、等号比較、
・・・)を出力する手続きを備える。
【0028】各手続きの内容は、以下のようになる。ま
ず、抽象構文木を文として出力する手続き Ps は、出力
しようとする抽象構文木の ルートノードの種類によっ
て分岐し、ルートノードが文を表すノードであった場合
は、その文の種類に応じて、文字列を出力する手続き P
i を呼び出す。ルートノードが式を表すノードであった
場合は、まず抽象構文木を式として出力する手続き Pe
を呼び出し、その後、式文を表すための区切り記号を出
力する。つぎに、抽象構文木を式として出力する手続き
Pe は、その式の種類に応じて分岐し、文字列を出力す
る手続き Pi を呼び出す。また、各構文を出力する手続
き Pi は、必要に応じてその構文を構成する各部分を、
それが文である場合は手続き Ps を再帰的に呼び出し、
それが式である場合は手続き Pe を再帰的に呼び出し、
また必要に応じて各部分の間を埋める文字列を出力する
ことにより、抽象構文木を文字列として出力する。
【0029】具体例として、文法が BNFによって次のよ
うに定義される、簡単な言語について考える。 文 ::= if文 | 式文 if文 ::= if ( 式 ) 文 else 文 式文 ::= 式 ; 式 ::= 等号比較 | 代入 | 変数 | 定数 等号比較 ::= 式 == 式 代入 ::= 式 = 式
【0030】図7は、次のプログラムを本発明で用いる
抽象構文木で表現したものである。 if (x == 0) y = 0; else y = 1; 本発明では、図1の従来技術による表現とは異なり、式
文を表すノードは用いない。式文 "y = 0;" は、式 "y
= 0" を表す抽象構文木そのものを用いて表現する。な
お、図7のような抽象構文木は、文字列で書かれた入力
ソースコードを、ソースコード変換プログラムの構文解
析器が構文解析を行うことにより作成するデータ構造で
ある。
【0031】図8〜図12は、本発明によってこの抽象
構文木を文字列に変換して出力する再帰的アルゴリズム
を示したものである。図8は、本発明における抽象構文
木を文として出力する手続きのフローチャートである。
図9は、本発明におけるif文を出力する手続きのフロー
チャートである。図10は、本発明における抽象構文木
を式として出力する手続きのフローチャートである。図
11は、本発明における等号比較を出力する手続きのフ
ローチャートである。図12は、本発明における代入を
出力する手続きのフローチャートである。図7の抽象構
文木を出力する場合を例にとって、出力手順を以下に説
明する。
【0032】まず、図8の「抽象構文木を文として出力
する手続き」を呼び出す。処理対象の抽象構文木は図7
のT71である。図8の手続きは、処理対象の抽象構文
木のルートノードの種類によって分岐を行なう。抽象構
文木T71の ルートノードの種類は if 文なので(ス
テップS84)、分岐して「if 文を出力する手続き」
を呼び出す(ステップS81)。図9の「if 文を出力
する手続き」においては、まず文字列 "if (" を出力し
(ステップS91)、1番目のサブツリーの内容である
"x == 0" を出力するために図10の「抽象構文木を式
として出力する手続き」を再帰的に呼び出し(ステップ
S92)、文字列 ")" を出力し(ステップS93)、
2番目のサブツリーの内容である "y = 0;" を出力する
ために図8の「抽象構文木を文として出力する手続き」
を再帰的に呼び出し(ステップS94)、文字列 " els
e " を出力し(ステップS95)、3番目のサブツリー
の内容である "y = 1;" を出力するために図8の「抽象
構文木を文として出力する手続き」を再帰的に呼び出し
(ステップS96)、図9の手続きを終了して呼び出し
元に戻る。
【0033】以上のような再帰的に呼び出すステップS
92、S94、S96について、以下に説明する。ここ
では、一例として、ステップS96の "y = 1;" の出力
手順について、さらに詳細に説明する(なお、ステップ
S92の "x == 0" の出力手順と、ステップS94の "
y = 0;" の出力手順の詳細な説明は省略するが、ステッ
プS96と同様に再帰的に行なわれる)。ステップS9
6は、図8の「抽象構文木を文として出力する手続き」
を再帰的に呼び出す。ここで、処理対象の抽象構文木は
T72とする。処理対象の抽象構文木の ルートノード
の種類は代入であるが、これは式の一種なので、分岐し
て図10の「抽象構文木を式として出力する手続き」を
呼び出して文字列 "y = 1" を出力し(ステップS8
2)、次に文字列 ";" を出力し(ステップS83)、
図8の手続きを終了して呼び出し元に戻る。
【0034】ここで、再帰的に呼び出すステップS82
の "y = 1" の出力手順について、さらに詳細に説明す
る。ステップS82は、図10の「抽象構文木を式とし
て出力する手続き」を再帰的に呼び出す。ここで、処理
対象の抽象構文木はT72とする。処理対象の抽象構文
木の ルートノードの種類は代入なので(ステップS1
07)、分岐して「代入を出力する手続き」を呼び出す
(ステップS102)。図12の「代入を出力する手続
き」においては、1番目のサブツリーの内容である "y"
を出力するために図10の「抽象構文木を式として出
力する手続き」をさらに再帰的に呼び出し(ステップS
121)、文字列 " = " を出力し(ステップS12
2)、2番目のサブツリーの内容である "1" を出力す
るために図10の「抽象構文木を式として出力する手続
き」をさらに再帰的に呼び出し(ステップS123)、
図12の手続きを終了して呼び出し元に戻る。
【0035】ここで、さらに再帰的に呼び出すステップ
S121の "y" の出力手順について、さらに詳細に説
明する。ステップS121は、図10の「抽象構文木を
式として出力する手続き」を再帰的に呼び出す。ここ
で、処理対象の抽象構文木はT73とする。処理対象の
抽象構文木の ルートノードの種類は変数なので(ステ
ップS109)、分岐して変数名 "y" を出力し(ステ
ップS103)、図10の手続きを終了して呼び出し元
である図12に戻る。
【0036】さらに再帰的に読み出すステップS123
の "1" の出力手順について、さらに詳細に説明する。
ステップS123は、図10の「抽象構文木を式として
出力する手続き」を再帰的に呼び出す。ここで、処理対
象の抽象構文木はT74とする。処理対象の抽象構文木
の ルートノードの種類は定数なので、分岐して定数名
"1" を出力し(ステップS103)、図10の手続き
を終了して呼び出し元である図12に戻る。なお、ルー
トノードの種類が想定外の種類であるときはエラー処理
を実行する(S86)。
【0037】以上のような再帰的な処理により、図7の
抽象構文木T71は、文字列 "if (x == 0) y = 0; els
e y = 1;" として出力される。なお、以上の説明は一例
にすぎず、 if文以外にも、 while 文等の各種構文や四
則演算等の各種式を構文規則に含むプログラミング言語
に対しても、本発明を適用することができる。また、本
発明のソースコード変換方法は、ソースコード変換プロ
グラムを記録した記録媒体により提供することができ
る。
【0038】つぎに、本発明の応用例について説明す
る。本発明は、 Java 言語用のプリプロセッサとして実
現・テスト済みである。図13は、このようなプリプロ
セッサの構成図の一例である。このプリプロセッサは、
Java 言語で書かれたソースコードを読み込み、何らか
の変換処理を施した結果、 Java 言語のソースコードを
別の場所に出力するものであり、内部構造はコンパイラ
とほとんど同じである。プリプロセッサ(10)に入力
されたソースコードは、字句解析器(1)および構文解
析器(2)によって構文解析され、文字列から抽象構文
木に変換される。抽象構文木は処理部(3)において、
変換処理を施され、出力部(4)において、再び抽象構
文木から文字列に変換されて、変換結果のソースコード
として出力される。抽象構文木は、本発明による方法を
用いて表現され、出力部(4)のアルゴリズムも本発明
を用いている。ここで、処理部(3)の変換処理は、例
えば、最適化処理、文書整形処理、異なったプログラミ
ング言語への変換処理など、様々な処理を実行すること
ができる。
【0039】
【発明の効果】本発明は、以上のように、ソースコード
変換処理およびバッククォートマクロ記述の際の従来の
課題を解決することができ、また、式文を表すノードを
用いずに抽象構文木を表現し、このような抽象構文木を
文字列に変換するソースコード変換方法を提供すること
ができる。本発明により以下のような効果がある。 1 抽象構文木を作る際に式と文との区別をしないで済
むため、ソースコード変換プログラムの実装が容易にな
る。 2 バッククォートマクロのシンタックスが簡単にな
る。例えばlisp 言語におけるバッククォートマクロを
用いた記述 `(if condition ,exp1 ,exp2) に相当するものが、 C 言語では `{if (condition) ,exp1; ,exp2;} というように書けるようになる。このように、従来技術
のように文と式との区別をプログラマーが書く必要がな
くなり、非常に記述しやすくなる。
【図面の簡単な説明】
【図1】従来技術における表現を用いた抽象構文木の
図。
【図2】従来技術における抽象構文木を文字列に変換し
て出力する手続きのフローチャート。
【図3】従来技術におけるif文を出力する手続きのフロ
ーチャート。
【図4】従来技術における式文を出力する手続きのフロ
ーチャート。
【図5】従来技術における等号比較を出力する手続きの
フローチャート。
【図6】従来技術における代入を出力する手続きのフロ
ーチャート。
【図7】本発明における表現を用いた抽象構文木の図。
【図8】本発明における抽象構文木を文として出力する
手続きのフローチャート。
【図9】本発明におけるif文を出力する手続きのフロー
チャート。
【図10】本発明における抽象構文木を式として出力す
る手続きのフローチャート。
【図11】本発明における等号比較を出力する手続きの
フローチャート。
【図12】本発明における代入を出力する手続きのフロ
ーチャート。
【図13】プリプロセッサの構成図。
【符号の説明】 S101 等号比較を出力する手続き S102 代入を出力する手続き S103 変数・定数名を出力 1 字句解析器 2 構文解析器 3 処理部 4 出力部
───────────────────────────────────────────────────── フロントページの続き (56)参考文献 特開 平11−249903(JP,A) 特開 平11−96016(JP,A) 特開 平5−250174(JP,A) 特開 平8−272622(JP,A) 特開 平1−175035(JP,A) 阿部洋丈ほか2名,ソースコード変換 技術を用いたJava言語におけるスレ ッドのモビリティの実現法,情報処理学 会論文誌,社団法人情報処理学会,2000 年3月15日,第41巻SIG(PRO6) 号,p.29−40 一杉裕志,高いモジュラリティと拡張 性を持つ構文解析器,情報処理学会論文 誌,社団法人情報処理学会,1998年12月 15日,第39巻SIG1号,p.61−69 一杉裕志,拡張可能Javaプリプロ セッサEPP,Computer To day,株式会社サイエンス社,1998年 11月1日,第15巻第6号,p.12−17 (58)調査した分野(Int.Cl.7,DB名) G06F 9/45

Claims (4)

    (57)【特許請求の範囲】
  1. 【請求項1】文と式とが文法的に区別されていること、 式に区切り記号を加えた式文が文の1つとして定義され
    ていること、 構文ごとにそれが式であるか文であるかが決まっている
    こと、及び、 構文ごとにその構文を構成する各部分が式か文かを判断
    可能になっていること、 という条件を満たすプログラミング言語で表現された入
    力ソースコードを、 同一又は異なる言語で表現された出力ソースコードへ変
    換するソースコード変換方法であって、 入力ソースコードが、式文を表す区切り記号に対応する
    ノードを用いずに表現された抽象構文木を、出力ソース
    コードとして出力するため、 抽象構文木を文として出力するステップと、 抽象構文木を式として出力するステップと、 各構文を出力するステップを含み、 前記抽象構文木を文として出力するステップは、出力し
    ようとする抽象構文木のルートノードの種類に従い、 ルートノードが文を表すノードである場合は、その文の
    種類に応じて、各構文を出力し、 ルートノードが式を表すノードである場合は、抽象構文
    木を式として出力し、 その後、式文を表す区切り記号を出力するようにし、 前記抽象構文木を式として出力するステップは、出力し
    ようとする抽象構文木のルートノードの種類に従い、そ
    の式の種類に応じて、各構文を出力するようにしたソー
    スコード変換方法。
  2. 【請求項2】前記各構文を出力するステップは、 その構文を構成する各部分について、 それが文である場合は、前記抽象構文木を文として出力
    するステップを再帰的に呼び出し、 それが式である場合は、前記抽象構文木を式として出力
    するステップを再帰的に呼び出し、 必要に応じて、各部分の間を埋める文字列を出力するこ
    とにより、 各構文を文字列として出力するようにした請求項1に記
    載のソースコード変換方法。
  3. 【請求項3】コンピュータに、 文と式とが文法的に区別されていること、 式に区切り記号を加えた式文が文の1つとして定義され
    ていること、 構文ごとにそれが式であるか文であるかが決まっている
    こと、及び、 構文ごとにその構文を構成する各部分が式か文かを判断
    可能になっていること、 という条件を満たすプログラミング言語で表現された入
    力ソースコードを、 同一又は異なる言語で表現された出力ソースコードへ
    換させるためのソースコード変換プログラムを記録した
    コンピュータ読み取り可能な記録媒体であって、 入力ソースコードが、式文を表す区切り記号に対応する
    ノードを用いずに表現された抽象構文木を、出力ソース
    コードとして出力するため、 抽象構文木を文として出力するステップと、 抽象構文木を式として出力するステップと、 各構文を出力するステップをコンピュータに実行させ、 前記抽象構文木を文として出力するステップは、コンピ
    ュータが、出力しようとする抽象構文木のルートノード
    の種類に従い、 ルートノードが文を表すノードである場合は、その文の
    種類に応じて、各構文を出力し、 ルートノードが式を表すノードである場合は、抽象構文
    木を式として出力し、 その後、式文を表す区切り記号を出力するようにし、 前記抽象構文木を式として出力するステップは、コンピ
    ュータが、出力しようとする抽象構文木のルートノード
    の種類に従い、その式の種類に応じて、各構文を出力す
    るようにしたソースコード変換プログラムを記録した
    ンピュータ読み取り可能な記録媒体。
  4. 【請求項4】文と式とが文法的に区別されていること、 式に区切り記号を加えた式文が文の1つとして定義され
    ていること、 構文ごとにそれが式であるか文であるかが決まっている
    こと、及び、 構文ごとにその構文を構成する各部分が式か文かを判断
    可能になっていること、 という条件を満たすプログラミング言語で表現された入
    力ソースコードを、 同一又は異なる言語で表現された出力ソースコードへ変
    換するソースコード変換装置であって、 入力ソースコードが、式文を表す区切り記号に対応する
    ノードを用いずに表現された抽象構文木を、出力ソース
    コードとして出力するため、 抽象構文木を文として出力する手段と、 抽象構文木を式として出力する手段と、 各構文を出力する手段を含み、 前記抽象構文木を文として出力する手段は、出力しよう
    とする抽象構文木のルートノードの種類に従い、 ルートノードが文を表すノードである場合は、その文の
    種類に応じて、各構文を出力し、 ルートノードが式を表すノードである場合は、抽象構文
    木を式として出力し、 その後、式文を表す区切り記号を出力するようにし、 前記抽象構文木を式として出力する手段は、出力しよう
    とする抽象構文木のルートノードの種類に従い、その式
    の種類に応じて、各構文を出力するようにしたソースコ
    ード変換装置。
JP2000015021A 2000-01-24 2000-01-24 ソースコード変換方法、ソースコード変換プログラムを記録した記録媒体及びソースコード変換装置 Expired - Lifetime JP3430252B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2000015021A JP3430252B2 (ja) 2000-01-24 2000-01-24 ソースコード変換方法、ソースコード変換プログラムを記録した記録媒体及びソースコード変換装置
US09/531,938 US6516461B1 (en) 2000-01-24 2000-03-21 Source code translating method, recording medium containing source code translator program, and source code translator device

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2000015021A JP3430252B2 (ja) 2000-01-24 2000-01-24 ソースコード変換方法、ソースコード変換プログラムを記録した記録媒体及びソースコード変換装置

Publications (2)

Publication Number Publication Date
JP2001209547A JP2001209547A (ja) 2001-08-03
JP3430252B2 true JP3430252B2 (ja) 2003-07-28

Family

ID=18542384

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2000015021A Expired - Lifetime JP3430252B2 (ja) 2000-01-24 2000-01-24 ソースコード変換方法、ソースコード変換プログラムを記録した記録媒体及びソースコード変換装置

Country Status (2)

Country Link
US (1) US6516461B1 (ja)
JP (1) JP3430252B2 (ja)

Families Citing this family (45)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
FR2798483B1 (fr) * 1999-08-16 2001-12-14 Cit Alcatel Procede de production automatique de specifications
US6698014B1 (en) * 1999-10-14 2004-02-24 Convert Systems Inc. System for automatically converting source code from one programming language to another
US20040205671A1 (en) * 2000-09-13 2004-10-14 Tatsuya Sukehiro Natural-language processing system
US6986129B2 (en) * 2001-05-16 2006-01-10 Sun Microsystems, Inc. System and method for java preprocessor
JP2003006255A (ja) * 2001-06-22 2003-01-10 Fujitsu Ltd Hdl自動修正装置およびhdl自動修正プログラム並びに同プログラムを記録したコンピュータ読取可能な記録媒体
US6938241B1 (en) * 2001-12-10 2005-08-30 Lsi Logic Corporation Compiler independent bit-field macros
US7188339B2 (en) * 2003-10-24 2007-03-06 Hewlett-Packard Development Company, L.P. ACPI preprocessor
US7627861B2 (en) * 2003-12-05 2009-12-01 The University Of North Carolina Methods, systems, and computer program products for identifying computer program source code constructs
US20060031820A1 (en) * 2004-08-09 2006-02-09 Aizhong Li Method for program transformation and apparatus for COBOL to Java program transformation
US9075630B1 (en) * 2005-11-14 2015-07-07 The Mathworks, Inc. Code evaluation of fixed-point math in the presence of customizable fixed-point typing rules
US8015554B2 (en) * 2006-03-24 2011-09-06 International Business Machines Corporation Source-to-source transformation for language dialects
WO2008108665A1 (en) * 2007-03-05 2008-09-12 Innaworks Development Limited A computer implemented translation method
US8181167B2 (en) * 2008-01-09 2012-05-15 Kan Zhao Method and system for presenting and analyzing software source code through intermediate representation
US20100037213A1 (en) * 2008-08-07 2010-02-11 Microsoft Corporation Grammar-based generation of types and extensions
US20100088686A1 (en) * 2008-10-06 2010-04-08 Microsoft Corporation Programming language with extensible syntax
US8312437B2 (en) * 2008-12-30 2012-11-13 Microsoft Corporation Structured search in source code
JPWO2010134123A1 (ja) * 2009-05-18 2012-11-08 株式会社Nst 試験支援装置および試験支援方法
US9043766B2 (en) * 2011-12-16 2015-05-26 Facebook, Inc. Language translation using preprocessor macros
CN102521008B (zh) * 2011-12-28 2014-12-10 用友软件股份有限公司 程序编译装置和程序编译方法
US9417935B2 (en) 2012-05-01 2016-08-16 Microsoft Technology Licensing, Llc Many-core process scheduling to maximize cache usage
US8726255B2 (en) 2012-05-01 2014-05-13 Concurix Corporation Recompiling with generic to specific replacement
US9047196B2 (en) 2012-06-19 2015-06-02 Concurix Corporation Usage aware NUMA process scheduling
US8700838B2 (en) 2012-06-19 2014-04-15 Concurix Corporation Allocating heaps in NUMA systems
US9575813B2 (en) 2012-07-17 2017-02-21 Microsoft Technology Licensing, Llc Pattern matching process scheduler with upstream optimization
US8707326B2 (en) 2012-07-17 2014-04-22 Concurix Corporation Pattern matching process scheduler in message passing environment
US8793669B2 (en) 2012-07-17 2014-07-29 Concurix Corporation Pattern extraction from executable code in message passing environments
US9043788B2 (en) 2012-08-10 2015-05-26 Concurix Corporation Experiment manager for manycore systems
US8656134B2 (en) 2012-11-08 2014-02-18 Concurix Corporation Optimized memory configuration deployed on executing code
US8656135B2 (en) 2012-11-08 2014-02-18 Concurix Corporation Optimized memory configuration deployed prior to execution
US8607018B2 (en) 2012-11-08 2013-12-10 Concurix Corporation Memory usage configuration based on observations
US20130227529A1 (en) 2013-03-15 2013-08-29 Concurix Corporation Runtime Memory Settings Derived from Trace Data
JP5844347B2 (ja) * 2013-12-27 2016-01-13 株式会社おおとり コンピュータプログラム生成装置
US10650046B2 (en) 2016-02-05 2020-05-12 Sas Institute Inc. Many task computing with distributed file system
US10642896B2 (en) 2016-02-05 2020-05-05 Sas Institute Inc. Handling of data sets during execution of task routines of multiple languages
US10795935B2 (en) 2016-02-05 2020-10-06 Sas Institute Inc. Automated generation of job flow definitions
US10140105B2 (en) * 2016-03-10 2018-11-27 Wowza Media Systems, LLC Converting source code
USD898059S1 (en) 2017-02-06 2020-10-06 Sas Institute Inc. Display screen or portion thereof with graphical user interface
USD898060S1 (en) 2017-06-05 2020-10-06 Sas Institute Inc. Display screen or portion thereof with graphical user interface
US10503498B2 (en) 2017-11-16 2019-12-10 Sas Institute Inc. Scalable cloud-based time series analysis
US10423396B1 (en) * 2018-05-04 2019-09-24 Salesforce.Com, Inc. Transforming non-apex code to apex code
CN110471666A (zh) * 2019-07-18 2019-11-19 五八有限公司 代码自动转换方法和装置、代码转换器及介质
CN111857811B (zh) * 2020-07-29 2023-09-22 湖南泛联新安信息科技有限公司 一种资源流图的构建方法
CN112346730B (zh) * 2020-11-04 2021-08-27 星环信息科技(上海)股份有限公司 一种中间表示的生成方法、计算机设备及存储介质
CN113760246B (zh) * 2021-09-06 2023-08-11 网易(杭州)网络有限公司 应用程序文本语言处理方法、装置、电子设备及存储介质
CN114416570B (zh) * 2022-01-20 2024-05-28 哈尔滨工业大学 基于加权软件行为图的等价变异体检测方法

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2134059C (en) * 1993-10-29 2009-01-13 Charles Simonyi Method and system for generating a computer program
JP2755154B2 (ja) * 1994-02-23 1998-05-20 日本電気株式会社 プログラム変換処理装置およびプログラム変換処理方法
US5742828A (en) * 1994-08-03 1998-04-21 Microsoft Corporation Compiler and method for evaluation of foreign syntax expressions in source code
US5768564A (en) * 1994-10-07 1998-06-16 Tandem Computers Incorporated Method and apparatus for translating source code from one high-level computer language to another
US6061513A (en) * 1997-08-18 2000-05-09 Scandura; Joseph M. Automated methods for constructing language specific systems for reverse engineering source code into abstract syntax trees with attributes in a form that can more easily be displayed, understood and/or modified
US6314562B1 (en) * 1997-09-12 2001-11-06 Microsoft Corporation Method and system for anticipatory optimization of computer programs
JP3230467B2 (ja) * 1997-09-25 2001-11-19 日本電気株式会社 Gdmoトランスレータ及びgdmoトランスレーション方法並びにgdmoトランスレータプログラムを記録した記録媒体
US6317873B1 (en) * 1998-10-14 2001-11-13 Alcatel Usa Sourcing, L.P. Assembly language translator

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
一杉裕志,拡張可能JavaプリプロセッサEPP,Computer Today,株式会社サイエンス社,1998年11月1日,第15巻第6号,p.12−17
一杉裕志,高いモジュラリティと拡張性を持つ構文解析器,情報処理学会論文誌,社団法人情報処理学会,1998年12月15日,第39巻SIG1号,p.61−69
阿部洋丈ほか2名,ソースコード変換技術を用いたJava言語におけるスレッドのモビリティの実現法,情報処理学会論文誌,社団法人情報処理学会,2000年3月15日,第41巻SIG(PRO6)号,p.29−40

Also Published As

Publication number Publication date
US6516461B1 (en) 2003-02-04
JP2001209547A (ja) 2001-08-03

Similar Documents

Publication Publication Date Title
JP3430252B2 (ja) ソースコード変換方法、ソースコード変換プログラムを記録した記録媒体及びソースコード変換装置
US7219338B2 (en) Multi-language compilation
Kodaganallur Incorporating language processing into java applications: A javacc tutorial
KR101213890B1 (ko) 강한 데이터 유형을 이용하여 소프트웨어 프로그램에서음성 인식 문법을 나타내기 위한 방법
JPS61103247A (ja) 翻訳プログラム作成システム
KR20050036973A (ko) Xml 스트리밍 변환기
US7043720B2 (en) Mechanism for reformatting a simple source code statement into a compound source code statement
CN114780100A (zh) 编译方法、电子设备及存储介质
US20080141230A1 (en) Scope-Constrained Specification Of Features In A Programming Language
RU2115158C1 (ru) Способ и устройство для достоверной оценки семантических признаков в синтаксическом анализе при проходе вперед слева направо
JP2879099B1 (ja) 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置
US20070169054A1 (en) Process of automatically translating a high level programming language into an extended activity diagram
US5349660A (en) Method of improving performance in an automated test system
CN112100059B (zh) 一种c语言的指针类型分析方法
KR20230040516A (ko) 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법
CN110737431B (zh) 软件开发方法、开发平台、终端设备及存储介质
Kamin Standard ML as a meta-programming language
JPH03260766A (ja) 括弧生成判定機能付翻訳装置
KR20120107032A (ko) 플렛폼 독립적 소스 코드 번역기
JP2675100B2 (ja) 言語変換器及び言語変換方法
US8015555B2 (en) Automaton loop construct (ALC) and method of performing program optimization using the ALC
Amal et al. Software tool for translating pseudocode to a programming language
JPH08286927A (ja) アセンブラ処理方式
JPH11224200A (ja) プログラム変換方法及び装置及びプログラム変換プログラムを格納した記憶媒体
CN117083592A (zh) 用于两遍源代码转换的方法、设备和介质

Legal Events

Date Code Title Description
TRDD Decision of grant or rejection written
R150 Certificate of patent or registration of utility model

Ref document number: 3430252

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

S533 Written request for registration of change of name

Free format text: JAPANESE INTERMEDIATE CODE: R313533

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

EXPY Cancellation because of completion of term