JP2879099B1 - 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置 - Google Patents
抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置Info
- Publication number
- JP2879099B1 JP2879099B1 JP6205598A JP6205598A JP2879099B1 JP 2879099 B1 JP2879099 B1 JP 2879099B1 JP 6205598 A JP6205598 A JP 6205598A JP 6205598 A JP6205598 A JP 6205598A JP 2879099 B1 JP2879099 B1 JP 2879099B1
- Authority
- JP
- Japan
- Prior art keywords
- syntax
- literal
- node
- data
- processing
- 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
Links
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
【要約】
【課題】 入力するプログラミング言語の仕様に変更が
あっても、その処理のソースコードをそのまま利用でき
るようにする。 【解決手段】 処理の対象となる抽象構文木のタグを調
べることによって、ノードがリテラルか構文かを判定す
る(ステップS01)。リテラルの場合は、リテラルタグ
を調べ、個別に必要な処理(ステップS021、S022、‥
‥)を行う。ただし、個別処理が必要ないリテラルに対
しては、その他のリテラルに対する一般的処理(ステッ
プS02j)を行う。構文の場合は、タグしたがって分岐
し、構文の種類ごとに個別に必要な処理(ステップS03
1、S032、‥‥)を行う。ただし、個別処理が必要ない
構文に対しては、その他の構文に対する一般的処理(ス
テップS03k)を行う。構文の場合は、処理中の抽象構
文木が持つサブツリーすべてに対して、再帰的に ステ
ップS01 から処理を行う(ステップS04)。木構造の
終端は、ノードがリテラルである場合に、判断すること
ができる。
あっても、その処理のソースコードをそのまま利用でき
るようにする。 【解決手段】 処理の対象となる抽象構文木のタグを調
べることによって、ノードがリテラルか構文かを判定す
る(ステップS01)。リテラルの場合は、リテラルタグ
を調べ、個別に必要な処理(ステップS021、S022、‥
‥)を行う。ただし、個別処理が必要ないリテラルに対
しては、その他のリテラルに対する一般的処理(ステッ
プS02j)を行う。構文の場合は、タグしたがって分岐
し、構文の種類ごとに個別に必要な処理(ステップS03
1、S032、‥‥)を行う。ただし、個別処理が必要ない
構文に対しては、その他の構文に対する一般的処理(ス
テップS03k)を行う。構文の場合は、処理中の抽象構
文木が持つサブツリーすべてに対して、再帰的に ステ
ップS01 から処理を行う(ステップS04)。木構造の
終端は、ノードがリテラルである場合に、判断すること
ができる。
Description
【0001】
【発明の属する技術分野】本発明は、抽象構文木処理方
法、抽象構文木処理プログラムを記録したコンピュータ
読み取り可能な記録媒体、抽象構文木データを記録した
コンピュータ読み取り可能な記録媒体、及び、抽象構文
木処理装置に係る。本発明は、特に、コンパイラ、プリ
プロセッサ又はソースコード処理ツール等の各種プログ
ラム言語において、プログラミング言語の言語仕様に依
存しないで抽象構文木を処理する装置、方法及びその処
理プログラムを記録した記録媒体及び抽象構文木のデー
タ構造を記録した記録媒体に関する。
法、抽象構文木処理プログラムを記録したコンピュータ
読み取り可能な記録媒体、抽象構文木データを記録した
コンピュータ読み取り可能な記録媒体、及び、抽象構文
木処理装置に係る。本発明は、特に、コンパイラ、プリ
プロセッサ又はソースコード処理ツール等の各種プログ
ラム言語において、プログラミング言語の言語仕様に依
存しないで抽象構文木を処理する装置、方法及びその処
理プログラムを記録した記録媒体及び抽象構文木のデー
タ構造を記録した記録媒体に関する。
【0002】
【従来の技術】通常、プリプロセッサ、プリティプリン
タなど、プログラムのソースコードに対して何らかの処
理を行なうプログラムは、文字列として入力されたプロ
グラムを構文解析することによって、処理しやすい木構
造のデータ構造に変換する。プリプロセッサによるプロ
グラムのソースコードに対して何らかの機械的変換を施
すプログラムにおいては、一般に、処理の流れは、次の
ようになる。
タなど、プログラムのソースコードに対して何らかの処
理を行なうプログラムは、文字列として入力されたプロ
グラムを構文解析することによって、処理しやすい木構
造のデータ構造に変換する。プリプロセッサによるプロ
グラムのソースコードに対して何らかの機械的変換を施
すプログラムにおいては、一般に、処理の流れは、次の
ようになる。
【0003】図7に、従来のプリプロセッサによる処理
の流れ図を示す。従来のプリプロセッサ200は、字句
解析器1、構文解析器2、処理部3及び出力部4を備え
る。字句解析器1は、文字列を構文解析しやすい形に切
り出し、区切りを入れて処理を行なう部分である。ここ
で、字句解析器1により切り出されたデータを、トーク
ンと呼ぶ。構文解析器2は、トークンの列を受け取り、
処理しやすい木構造を持ったデータ構造に変換する処理
を行なう部分である。このソースコードを木構造で表現
したものを抽象構文木と呼ぶ。処理部3では、この抽象
構文木に対して構造を変換する処理を行なう。さらに、
出力部4は、抽象構文木を再び文字列に戻して出力す
る。なお、プリプロセッサ200の中には、構文解析を
行なわず、文字列やトークン列の段階のデータに対して
処理を行なう単純なものもある。
の流れ図を示す。従来のプリプロセッサ200は、字句
解析器1、構文解析器2、処理部3及び出力部4を備え
る。字句解析器1は、文字列を構文解析しやすい形に切
り出し、区切りを入れて処理を行なう部分である。ここ
で、字句解析器1により切り出されたデータを、トーク
ンと呼ぶ。構文解析器2は、トークンの列を受け取り、
処理しやすい木構造を持ったデータ構造に変換する処理
を行なう部分である。このソースコードを木構造で表現
したものを抽象構文木と呼ぶ。処理部3では、この抽象
構文木に対して構造を変換する処理を行なう。さらに、
出力部4は、抽象構文木を再び文字列に戻して出力す
る。なお、プリプロセッサ200の中には、構文解析を
行なわず、文字列やトークン列の段階のデータに対して
処理を行なう単純なものもある。
【0004】以下に、従来の抽象構文木のフォーマット
の定義およびそれに対する処理の一例を説明する。一般
に、プログラムのソースコードは、「リテラル」と、リ
テラル以外の「構文」からなる。リテラルとは、整数定
数、文字列定数などである。一方、構文とは、 if 文、
while 文、式、関数呼び出しなどである。また、抽象
構文木とは、リテラルおよび構文をノードとして持つ木
構造のデータである。一般に構文は、内部に別のリテラ
ルあるいは構文を含んでいる。抽象構文木では、内部に
サブツリー(サブツリーもまた抽象構文木である)を持
たせることでこれを表現する。従来において、抽象構文
木のノードは、構文およびリテラルの種類ごとに、異な
るデータ構造のノードから構成されていた。例えば、従
来の方法による抽象構文木の、各ノードの典型的なフォ
ーマット定義例は、次のようになる。なお、ここでは簡
単のために lisp 風にS式を用いて表現しているが、C,
Pascal などの他のプログラミング言語でも、同じ内容
を構造体などの機構を使って表現することができる。
の定義およびそれに対する処理の一例を説明する。一般
に、プログラムのソースコードは、「リテラル」と、リ
テラル以外の「構文」からなる。リテラルとは、整数定
数、文字列定数などである。一方、構文とは、 if 文、
while 文、式、関数呼び出しなどである。また、抽象
構文木とは、リテラルおよび構文をノードとして持つ木
構造のデータである。一般に構文は、内部に別のリテラ
ルあるいは構文を含んでいる。抽象構文木では、内部に
サブツリー(サブツリーもまた抽象構文木である)を持
たせることでこれを表現する。従来において、抽象構文
木のノードは、構文およびリテラルの種類ごとに、異な
るデータ構造のノードから構成されていた。例えば、従
来の方法による抽象構文木の、各ノードの典型的なフォ
ーマット定義例は、次のようになる。なお、ここでは簡
単のために lisp 風にS式を用いて表現しているが、C,
Pascal などの他のプログラミング言語でも、同じ内容
を構造体などの機構を使って表現することができる。
【0005】 整数リテラル : (int <整数>) 文字列リテラル : (string "文字列") 浮動小数点リテラル : (float <浮動小数点数>) 変数名 : (identifier <変数名番号>) if 文 : (if <条件式> <本体1> <本体2または記号 nil> ) (*注:通常のプログラミング言語において は if 文の2つめの本体は省略可能であるた め、 ここでは記号 nil を使って本体2が省略 され たことを表現している。) while 文 : (while <条件式> <本体>) 手続き定義文 : (procedure <返値の型> <手続き名ID> <引数リスト> <定義本体>)
【0006】ここで、それぞれのかっこの中の一番目の
要素(int, string, float, ...等)が、ノードの種類
を現わす部分であり、これを「タグ」と呼ぶ。
要素(int, string, float, ...等)が、ノードの種類
を現わす部分であり、これを「タグ」と呼ぶ。
【0007】このような抽象構文木のフォーマットを用
いて、入力ソースコードを表現した一例を以下に示す。
これは、「x=0 ならば、"zero"を印刷する。」という
命令である。抽象構文木では、「x」が、変数名番号「1
2」に記憶されている場合である。
いて、入力ソースコードを表現した一例を以下に示す。
これは、「x=0 ならば、"zero"を印刷する。」という
命令である。抽象構文木では、「x」が、変数名番号「1
2」に記憶されている場合である。
【0008】
【0009】ここで、図8に、このときの従来の抽象構
文木の構成図を示す。この例のようなフォーマット定義
の場合、抽象構文木に対する操作は、一般に次のような
形になる。
文木の構成図を示す。この例のようなフォーマット定義
の場合、抽象構文木に対する操作は、一般に次のような
形になる。
【0010】 抽象構文木 T に対する処理手続きAの定義{ T のタグを見て分岐: "int" の場合 { T を整数リテラルとして処理 } "string" の場合 { T を文字列リテラルとして処理 } ...(省略)... "if" の場合 { T を if 文として処理、サブツリーを再
帰的に処理 } "while" の場合 { T を while 文として処理、サブツリ
ーを再帰的に処 理 } ...(省略)... その他の場合 { エラーメッセージを出力 } }
帰的に処理 } "while" の場合 { T を while 文として処理、サブツリ
ーを再帰的に処 理 } ...(省略)... その他の場合 { エラーメッセージを出力 } }
【0011】抽象構文木に対する処理手続きの例とし
て、ソースコード中に if 文が現れる回数を数える手続
きを疑似コードで書くと以下のようになる。
て、ソースコード中に if 文が現れる回数を数える手続
きを疑似コードで書くと以下のようになる。
【0012】 初期設定 { カウンタを0にする counter := 0 } 手続き countIf (T){ T のタグの値で分岐: "int" の場合{ 何もしない } "string" の場合{ 何もしない } ...(省略)... "if" の場合{ カウンタを1増やす counter := counter + 1 再帰的に countIf(<条件式>) を呼ぶ 再帰的に countIf(<本体1>) を呼ぶ <本体2> の値に従って分岐: 記号 nil の場合{ 何もしない } サブツリーの場合{ 再帰的に countIf(<本体2>) を呼ぶ } } "while" の場合 { 再帰的に countIf(<条件式>) を呼ぶ 再帰的に countIf(<本体>) を呼ぶ } ...(省略)... }
【0013】ここで、言語仕様に次のような構文が追加
されたとする。 repeat 文: (repeat <本体> <条件式>) すると、上記の抽象構文木操作手続きは、次のように変
更しなければならなくなる。すなわち、条件分岐に rep
eat 文の場合の処理を追加する必要がある。
されたとする。 repeat 文: (repeat <本体> <条件式>) すると、上記の抽象構文木操作手続きは、次のように変
更しなければならなくなる。すなわち、条件分岐に rep
eat 文の場合の処理を追加する必要がある。
【0014】 手続き countIf (T){ T のタグの値で分岐: "int" の場合{ 何もしない } "string" の場合{ 何もしない } ...(省略)... "if" の場合{ カウンタを1増やす counter := counter + 1 再帰的に countIf(<条件式>) を呼ぶ 再帰的に countIf(<本体1>) を呼ぶ <本体2> の値に従って分岐: 記号 nil の場合{ 何もしない } サブツリーの場合{ 再帰的に countIf(<本体2>) を呼ぶ } } "while" の場合 { 再帰的に countIf(<条件式>) を呼ぶ 再帰的に countIf(<本体>) を呼ぶ } "repeat" の場合 { 再帰的に countIf(<本体>) を呼ぶ 再帰的に countIf(<条件式>) を呼ぶ } ...(省略)... }
【0015】
【発明が解決しようとする課題】従来の方法は、入力す
るプログラミング言語の仕様にほとんど変化がない場合
には、特に大きな問題はない。しかしながら、プログラ
ミング言語の文法が頻繁に拡張される場合、従来のよう
にリテラルおよび構文ごとにノードのフォーマットが決
められていると、言語仕様が拡張されるたびに新たな種
類のノードを定義しなければならない。また、それに従
ってその抽象構文木を操作するプログラムもすべて作り
直さなければならないという問題があった。
るプログラミング言語の仕様にほとんど変化がない場合
には、特に大きな問題はない。しかしながら、プログラ
ミング言語の文法が頻繁に拡張される場合、従来のよう
にリテラルおよび構文ごとにノードのフォーマットが決
められていると、言語仕様が拡張されるたびに新たな種
類のノードを定義しなければならない。また、それに従
ってその抽象構文木を操作するプログラムもすべて作り
直さなければならないという問題があった。
【0016】例えば、上述の例では、以下のような定義
が新たに必要となる。 "repeat" の場合 { 再帰的に countIf(<本体>) を呼ぶ 再帰的に countIf(<条件式>) を呼ぶ }
が新たに必要となる。 "repeat" の場合 { 再帰的に countIf(<本体>) を呼ぶ 再帰的に countIf(<条件式>) を呼ぶ }
【0017】このように、従来は、新しい構文が追加さ
れるたびに、独自のフォーマットを持ったノードを定義
が追加され、それに伴って、抽象構文木の再帰処理をす
る部分をすべて変更する必要があった。
れるたびに、独自のフォーマットを持ったノードを定義
が追加され、それに伴って、抽象構文木の再帰処理をす
る部分をすべて変更する必要があった。
【0018】そこで、本発明は、以上の点に鑑み、規定
するフォーマットとその再帰処理方法を採用することに
より、入力するプログラミング言語の仕様に変更があっ
ても(例えば、新たなリテラルや構文が追加されて
も)、その変更が本質的に影響を及ぼさない処理である
限り、ソースコードに処理を施すプログラムを特に変更
しなくても、その処理のソースコードの大部分は変更せ
ずにそのまま利用できるようにすることを目的とする。
するフォーマットとその再帰処理方法を採用することに
より、入力するプログラミング言語の仕様に変更があっ
ても(例えば、新たなリテラルや構文が追加されて
も)、その変更が本質的に影響を及ぼさない処理である
限り、ソースコードに処理を施すプログラムを特に変更
しなくても、その処理のソースコードの大部分は変更せ
ずにそのまま利用できるようにすることを目的とする。
【0019】また、本発明は、将来の言語仕様拡張でど
のようなリテラルや構文が追加されるかは全く予測でき
ないような状況においても、基本的なフォーマットを変
更せずに表現できる抽象構文木のデータ構造を提供する
ことを目的とする。また、本発明は、これによって、そ
の抽象構文木に対して操作を施すプログラムは、構文が
拡張されても変更せずに再利用することができるように
することを目的とする。なお、本発明が規定するフォー
マットを用いることによって、おそらく、考えられるほ
とんどのすべてのプログラミング言語のソースコードが
表現できるようにすることを目的とする。
のようなリテラルや構文が追加されるかは全く予測でき
ないような状況においても、基本的なフォーマットを変
更せずに表現できる抽象構文木のデータ構造を提供する
ことを目的とする。また、本発明は、これによって、そ
の抽象構文木に対して操作を施すプログラムは、構文が
拡張されても変更せずに再利用することができるように
することを目的とする。なお、本発明が規定するフォー
マットを用いることによって、おそらく、考えられるほ
とんどのすべてのプログラミング言語のソースコードが
表現できるようにすることを目的とする。
【0020】
【課題を解決するための手段】本発明の第1の解決手段
によると、リテラル又は構文をノードとして有する木構
造のデータを表現した抽象構文木において、前記抽象構
文木に含まれるあるノードが前記リテラルであるか前記
構文であるかを判定するステップと、前記ノードがリテ
ラルの場合、前記リテラルの種類を表すリテラルタグに
基づいて、前記リテラルの種類毎にリテラル用個別処理
が定義されているときは前記リテラル用個別処理を実行
し、前記リテラル用個別処理が定義されていないときは
その他のリテラルに対するリテラル用一般的処理を実行
するステップと、一方、前記ノードが構文の場合、前記
構文の種類毎に構文用個別処理が定義されているときは
前記構文用個別処理を実行し、前記構文用個別処理が定
義されていないときはその他の構文に対する構文用一般
的処理を実行するステップと、処理中の前記構文に含ま
れるすべてのサブツリーについて、ノードがリテラルか
構文かに応じて、対応する前記リテラル用若しくは構文
用個別処理又は前記リテラル用若しくは構文用一般的処
理を再帰的に実行するステップとを備えた抽象構文木処
理方法を提供する。
によると、リテラル又は構文をノードとして有する木構
造のデータを表現した抽象構文木において、前記抽象構
文木に含まれるあるノードが前記リテラルであるか前記
構文であるかを判定するステップと、前記ノードがリテ
ラルの場合、前記リテラルの種類を表すリテラルタグに
基づいて、前記リテラルの種類毎にリテラル用個別処理
が定義されているときは前記リテラル用個別処理を実行
し、前記リテラル用個別処理が定義されていないときは
その他のリテラルに対するリテラル用一般的処理を実行
するステップと、一方、前記ノードが構文の場合、前記
構文の種類毎に構文用個別処理が定義されているときは
前記構文用個別処理を実行し、前記構文用個別処理が定
義されていないときはその他の構文に対する構文用一般
的処理を実行するステップと、処理中の前記構文に含ま
れるすべてのサブツリーについて、ノードがリテラルか
構文かに応じて、対応する前記リテラル用若しくは構文
用個別処理又は前記リテラル用若しくは構文用一般的処
理を再帰的に実行するステップとを備えた抽象構文木処
理方法を提供する。
【0021】本発明の第2の解決手段によると、リテラ
ル又は構文をノードとして有する木構造のデータを表現
した抽象構文木において、前記抽象構文木に含まれるあ
るノードが前記リテラルであるか前記構文であるかを判
定するステップと、前記ノードがリテラルの場合、前記
リテラルの種類を表すリテラルタグに基づいて、前記リ
テラルの種類毎にリテラル用個別処理が定義されている
ときは前記リテラル用個別処理を実行し、前記リテラル
用個別処理が定義されていないときはその他のリテラル
に対するリテラル用一般的処理を実行するステップと、
一方、前記ノードが構文の場合、前記構文の種類毎に構
文用個別処理が定義されているときは前記構文用個別処
理を実行し、前記構文用個別処理が定義されていないと
きはその他の構文に対する構文用一般的処理を実行する
ステップと、処理中の前記構文に含まれるすべてのサブ
ツリーについて、ノードがリテラルか構文かに応じて、
対応する前記リテラル用若しくは構文用個別処理又は前
記リテラル用若しくは構文用一般的処理を再帰的に実行
するステップとを備えた抽象構文木処理プログラムを記
録したコンピュータ読み取り可能な記録媒体を提供す
る。
ル又は構文をノードとして有する木構造のデータを表現
した抽象構文木において、前記抽象構文木に含まれるあ
るノードが前記リテラルであるか前記構文であるかを判
定するステップと、前記ノードがリテラルの場合、前記
リテラルの種類を表すリテラルタグに基づいて、前記リ
テラルの種類毎にリテラル用個別処理が定義されている
ときは前記リテラル用個別処理を実行し、前記リテラル
用個別処理が定義されていないときはその他のリテラル
に対するリテラル用一般的処理を実行するステップと、
一方、前記ノードが構文の場合、前記構文の種類毎に構
文用個別処理が定義されているときは前記構文用個別処
理を実行し、前記構文用個別処理が定義されていないと
きはその他の構文に対する構文用一般的処理を実行する
ステップと、処理中の前記構文に含まれるすべてのサブ
ツリーについて、ノードがリテラルか構文かに応じて、
対応する前記リテラル用若しくは構文用個別処理又は前
記リテラル用若しくは構文用一般的処理を再帰的に実行
するステップとを備えた抽象構文木処理プログラムを記
録したコンピュータ読み取り可能な記録媒体を提供す
る。
【0022】本発明の第3の解決手段によると、リテラ
ル又は構文をノードとして有する木構造で表現した抽象
構文木データを記録したコンピュータ読み取り可能な記
録媒体であって、前記ノードがリテラルであることを示
すタグ、前記リテラルの種類を表すリテラルタグ及び前
記リテラルの内容を表すためのリテラル内容の各領域を
含むリテラルデータと、前記ノードが構文であることを
示すタグ及びサブツリー数分のサブツリーリストの各領
域を含む構文データとを備え、前記抽象構文木データを
各ノードについての前記リテラルデータ及び前記構文デ
ータによる木構造で表現し、前記抽象構文木のノード
は、前記タグに基づいて前記リテラルデータであるか前
記構文データであるかが判定され、その判定結果に応じ
て、前記リテラルデータ及び前記構文データ及び前記構
文に含まれるすべてのサブツリーリスト中の前記リテラ
ルデータ並びに前記構文データについて、対応する個別
処理又は一般的処理が再帰的に実行される抽象構文木デ
ータを記録したコンピュータ読み取り可能な記録媒体を
提供する。
ル又は構文をノードとして有する木構造で表現した抽象
構文木データを記録したコンピュータ読み取り可能な記
録媒体であって、前記ノードがリテラルであることを示
すタグ、前記リテラルの種類を表すリテラルタグ及び前
記リテラルの内容を表すためのリテラル内容の各領域を
含むリテラルデータと、前記ノードが構文であることを
示すタグ及びサブツリー数分のサブツリーリストの各領
域を含む構文データとを備え、前記抽象構文木データを
各ノードについての前記リテラルデータ及び前記構文デ
ータによる木構造で表現し、前記抽象構文木のノード
は、前記タグに基づいて前記リテラルデータであるか前
記構文データであるかが判定され、その判定結果に応じ
て、前記リテラルデータ及び前記構文データ及び前記構
文に含まれるすべてのサブツリーリスト中の前記リテラ
ルデータ並びに前記構文データについて、対応する個別
処理又は一般的処理が再帰的に実行される抽象構文木デ
ータを記録したコンピュータ読み取り可能な記録媒体を
提供する。
【0023】本発明の第4の解決手段によると、入力ソ
ースコードに基づいてトークン列に解析する字句解析部
と、前記字句解析器により解析された前記トークン列か
ら、前記リテラル又は前記構文をノードとして有する木
構造で表現し、前記ノードがリテラル又は構文であるこ
とを示すタグを含むデータとして表現した抽象構文木に
解析する構文解析部と、前記構文解析器により解析され
た前記抽象構文木の各ノードを、前記タグに基づいて、
前記リテラルデータであるか前記構文データであるかを
判定し、その判定結果に応じて、前記リテラルデータ及
び前記構文データ及び前記構文に含まれるすべてのサブ
ツリーの前記リテラルデータ並びに前記構文データにつ
いて、対応する個別処理又は一般的処理を再帰的に実行
する処理部と、前記処理部により求められた前記抽象構
文木を文字列に変換した出力ソースコードを出力する出
力部とを備えた抽象構文木処理装置を提供する。
ースコードに基づいてトークン列に解析する字句解析部
と、前記字句解析器により解析された前記トークン列か
ら、前記リテラル又は前記構文をノードとして有する木
構造で表現し、前記ノードがリテラル又は構文であるこ
とを示すタグを含むデータとして表現した抽象構文木に
解析する構文解析部と、前記構文解析器により解析され
た前記抽象構文木の各ノードを、前記タグに基づいて、
前記リテラルデータであるか前記構文データであるかを
判定し、その判定結果に応じて、前記リテラルデータ及
び前記構文データ及び前記構文に含まれるすべてのサブ
ツリーの前記リテラルデータ並びに前記構文データにつ
いて、対応する個別処理又は一般的処理を再帰的に実行
する処理部と、前記処理部により求められた前記抽象構
文木を文字列に変換した出力ソースコードを出力する出
力部とを備えた抽象構文木処理装置を提供する。
【0024】
(1)各用語に関する説明 本発明の実施の形態を説明するにあたり、まず、以下に
各用語に関しての定義や説明を述べる。
各用語に関しての定義や説明を述べる。
【0025】・抽象構文木(abstract syntax tree)に関
して ほとんどのプログラミング言語は、 if 文、 while 文
などの構文が入れ子になった構造を持っている。コンパ
イラは、単なる文字列であるソースコードを構文解析
し、「抽象構文木」というデータ構造に変換する。「抽
象構文木」は、再帰的な木構造を持ったデータ構造であ
る。(ただし、1パスコンパイラのように、「抽象構文
木」を作らず、構文解析しながら直接コード生成を行な
う場合もある。) ・ノード(node)に関して 抽象構文木は、ノードが再帰的に繰り返される構造を持
つ。
して ほとんどのプログラミング言語は、 if 文、 while 文
などの構文が入れ子になった構造を持っている。コンパ
イラは、単なる文字列であるソースコードを構文解析
し、「抽象構文木」というデータ構造に変換する。「抽
象構文木」は、再帰的な木構造を持ったデータ構造であ
る。(ただし、1パスコンパイラのように、「抽象構文
木」を作らず、構文解析しながら直接コード生成を行な
う場合もある。) ・ノード(node)に関して 抽象構文木は、ノードが再帰的に繰り返される構造を持
つ。
【0026】・再帰的構造(recursive structure)に関
して 抽象構文木のように、あるデータ構造の一部に、全体と
同じデータ構造が含まれているものを「再帰的構造」と
呼ぶ。 ・再帰的処理及び再帰呼び出し(recursive call)に関し
て 「再帰的処理及び再帰呼び出し」は、再帰的構造に対す
る処理の方法である。木構造を引数にとる手続きの場
合、サブツリーを引数として再び自分自身を呼び出す形
になる。これを「再帰呼び出し」と呼び、この処理を
「再帰的処理」と呼ぶ。なお、引数のツリーがサブツリ
ーを持たない場合は、それ以上自分自身を呼ばないよう
に書かないといけない。そうしないと無限に自分自身を
呼び出して停止しなくなってしまう。 ・リテラル(literal)に関して 「リテラル」とは、プログラムのソースコード中に現れ
る定数である。例えば123 は、整数リテラル、 "abc"
は、文字列リテラルと呼ばれる。「リテラル」も抽象構
文木のノードの1つだが、サブツリーは持たない。・言
語構文(language structure)に関してif 文、 while 文
などの言語構文を、本文書では単に「構文」と呼ぶこと
にする。通常、構文は、抽象構文木をサブツリーとして
持つ。(なお、サブツリーを持たないものもある。)
して 抽象構文木のように、あるデータ構造の一部に、全体と
同じデータ構造が含まれているものを「再帰的構造」と
呼ぶ。 ・再帰的処理及び再帰呼び出し(recursive call)に関し
て 「再帰的処理及び再帰呼び出し」は、再帰的構造に対す
る処理の方法である。木構造を引数にとる手続きの場
合、サブツリーを引数として再び自分自身を呼び出す形
になる。これを「再帰呼び出し」と呼び、この処理を
「再帰的処理」と呼ぶ。なお、引数のツリーがサブツリ
ーを持たない場合は、それ以上自分自身を呼ばないよう
に書かないといけない。そうしないと無限に自分自身を
呼び出して停止しなくなってしまう。 ・リテラル(literal)に関して 「リテラル」とは、プログラムのソースコード中に現れ
る定数である。例えば123 は、整数リテラル、 "abc"
は、文字列リテラルと呼ばれる。「リテラル」も抽象構
文木のノードの1つだが、サブツリーは持たない。・言
語構文(language structure)に関してif 文、 while 文
などの言語構文を、本文書では単に「構文」と呼ぶこと
にする。通常、構文は、抽象構文木をサブツリーとして
持つ。(なお、サブツリーを持たないものもある。)
【0027】・識別子(identifier)に関して 「識別子」には、変数名、関数名などがある。識別子
も、抽象構文木のノードになる。 ・トークン(token)に関して 「トークン」とは、プログラムを構文解析しやすいよう
に区切ったものである。変数名、数値、キーワード、演
算子、その他の記号などが、それぞれ「トークン」とし
て表される。 ・構文解析器(parser)に関して プログラムのソースコードを処理するには、まず「構文
解析(parse)」を行なう必要がある。入力されたソース
コードの構造を解釈して、抽象構文木という内部表現に
変換する作業を「構文解析」と言い、それを行なうプロ
グラムを「構文解析器」と言う。構文解析器は、トーク
ンの列を抽象構文木に変換する役割を果たす。 ・字句解析器(lexical analyzer)に関して コンパイラの一部である構文解析器は、「字句解析器」
というサブルーチンを呼び出す。「字句解析器」は、プ
ログラムのソースコードから「トークン」をひとつずつ
切り出す役割を果たす。
も、抽象構文木のノードになる。 ・トークン(token)に関して 「トークン」とは、プログラムを構文解析しやすいよう
に区切ったものである。変数名、数値、キーワード、演
算子、その他の記号などが、それぞれ「トークン」とし
て表される。 ・構文解析器(parser)に関して プログラムのソースコードを処理するには、まず「構文
解析(parse)」を行なう必要がある。入力されたソース
コードの構造を解釈して、抽象構文木という内部表現に
変換する作業を「構文解析」と言い、それを行なうプロ
グラムを「構文解析器」と言う。構文解析器は、トーク
ンの列を抽象構文木に変換する役割を果たす。 ・字句解析器(lexical analyzer)に関して コンパイラの一部である構文解析器は、「字句解析器」
というサブルーチンを呼び出す。「字句解析器」は、プ
ログラムのソースコードから「トークン」をひとつずつ
切り出す役割を果たす。
【0028】・S式(S-expression)に関して 「S式」とは、lisp 言語における list と呼ぶデータ
構造の表現方法。 かっこの中に、要素をならべて表
す。 ・データの表現に関して 構文解析の各段階におけるデータの表現は、例えば以下
のようになる。このデータ列は、「x = 0ならば、'zer
o'を印刷する。」という内容である。 入力文字列: "if (x = 0) begin print('zero') end;" トークン列: "if" "(" "x" "=" "0" "begin" "print" "(" "'zero'" ")" "end" ";" 抽象構文木(S式): (if (equal (identifier 34) (int 0)) (block (print (string "zero"))) nil) (なお、ここでは、識別子34が、x に対応する。)
構造の表現方法。 かっこの中に、要素をならべて表
す。 ・データの表現に関して 構文解析の各段階におけるデータの表現は、例えば以下
のようになる。このデータ列は、「x = 0ならば、'zer
o'を印刷する。」という内容である。 入力文字列: "if (x = 0) begin print('zero') end;" トークン列: "if" "(" "x" "=" "0" "begin" "print" "(" "'zero'" ")" "end" ";" 抽象構文木(S式): (if (equal (identifier 34) (int 0)) (block (print (string "zero"))) nil) (なお、ここでは、識別子34が、x に対応する。)
【0029】(2)抽象構文木とその処理 つぎに、抽象構文木のフォーマットの定義について説明
する。図1に、ノードの構造の説明図を示す。抽象構文
木を構成するノードを、以下のような統一的な再帰的デ
ータ構造として定義する。 抽象構文木のノードの定義:ノードは、ノードの種類を
現わすタグを持つものとする。また、ノードは、リテラ
ルか構文かのいずれかであるとする。
する。図1に、ノードの構造の説明図を示す。抽象構文
木を構成するノードを、以下のような統一的な再帰的デ
ータ構造として定義する。 抽象構文木のノードの定義:ノードは、ノードの種類を
現わすタグを持つものとする。また、ノードは、リテラ
ルか構文かのいずれかであるとする。
【0030】図1(a)に示されるように、ノードが
「リテラル」の場合には、(1)タグ、(2)リテラル
の種類を表すリテラルタグ、(3)リテラルの内容を表
す文字列の3つからなるデータ構造をもってノードを表
現する。タグには、ノードがリテラルであることを表す
値を入れる。一方、図1(b)に示されるように、ノー
ドが「構文」の場合には、(1)タグ、(2)サブツリ
ーの数 N 、(3)サブツリーのリスト(木1、木2、木
3、・・・、木N)の3つからなるデータ構造をもってノ
ードを表現する。タグには、構文の種類を表す値を入れ
る。各サブツリーは、本定義によって定義される構造を
持つ抽象構文木である。このように、リテラル又は構文
のいずれにおいても、タグを備える。
「リテラル」の場合には、(1)タグ、(2)リテラル
の種類を表すリテラルタグ、(3)リテラルの内容を表
す文字列の3つからなるデータ構造をもってノードを表
現する。タグには、ノードがリテラルであることを表す
値を入れる。一方、図1(b)に示されるように、ノー
ドが「構文」の場合には、(1)タグ、(2)サブツリ
ーの数 N 、(3)サブツリーのリスト(木1、木2、木
3、・・・、木N)の3つからなるデータ構造をもってノ
ードを表現する。タグには、構文の種類を表す値を入れ
る。各サブツリーは、本定義によって定義される構造を
持つ抽象構文木である。このように、リテラル又は構文
のいずれにおいても、タグを備える。
【0031】また、図2に、本発明による表現を用いた
抽象構文木の説明図を示す。図示のように、抽象構文木
は、一般に、各ノードがツリー状(木構造)に結合され
ている。通常、構文は、構文又はリテラルをサブツリー
として有し、一方、リテラルは、ツリーの終端となる。
本発明が規定するフォーマットによるノードの具体的な
実現方法は、構文解析器2および処理部3を記述するプ
ログラミング言語によって異なる。例えば lisp 言語を
用いる場合は list を使ったS式で、また、 C言語を用
いる場合は構造体と配列を使って実現することができ
る。以下に、具体的な実現方法を述べる。まず、lisp
言語におけるS式を用いて抽象構文木を表現すると、以
下のようになる。
抽象構文木の説明図を示す。図示のように、抽象構文木
は、一般に、各ノードがツリー状(木構造)に結合され
ている。通常、構文は、構文又はリテラルをサブツリー
として有し、一方、リテラルは、ツリーの終端となる。
本発明が規定するフォーマットによるノードの具体的な
実現方法は、構文解析器2および処理部3を記述するプ
ログラミング言語によって異なる。例えば lisp 言語を
用いる場合は list を使ったS式で、また、 C言語を用
いる場合は構造体と配列を使って実現することができ
る。以下に、具体的な実現方法を述べる。まず、lisp
言語におけるS式を用いて抽象構文木を表現すると、以
下のようになる。
【0032】 リテラル (literal <リテラルタグ> <リテラルの中身>) 構文 (<タグ> <木1> <木2> <木3> ...)
【0033】ここで、<リテラルの中身> は、このリテ
ラルの情報を文字列にして表現したものである。文字列
の中にどういう情報を入れるかは、リテラルの種類ごと
に異なる。 例: 123 → (literal int "123") "abcde" → (literal string "abcde") -12.34 → (literal float "-12.34")
ラルの情報を文字列にして表現したものである。文字列
の中にどういう情報を入れるかは、リテラルの種類ごと
に異なる。 例: 123 → (literal int "123") "abcde" → (literal string "abcde") -12.34 → (literal float "-12.34")
【0034】リテラル以外の構文は、構文の種類をあら
わすタグと、その構文の中身をあらわす可変個のサブツ
リーからなる。なお、S式の場合は、サブツリーのリス
トの長さは容易に数えることができるので、例えば図1
(b)において、サブツリーの数Nを数値として保持し
ておく必要はない。
わすタグと、その構文の中身をあらわす可変個のサブツ
リーからなる。なお、S式の場合は、サブツリーのリス
トの長さは容易に数えることができるので、例えば図1
(b)において、サブツリーの数Nを数値として保持し
ておく必要はない。
【0035】この抽象構文木のフォーマットを用いた表
現の例は以下のようになる。 例: 入力ソースコード: "if (x = 0) begin print('zero') end;" ↓ 抽象構文木: (if (equal (literal identifier "x") (literal int "0")) (print (literal string "zero")))
現の例は以下のようになる。 例: 入力ソースコード: "if (x = 0) begin print('zero') end;" ↓ 抽象構文木: (if (equal (literal identifier "x") (literal int "0")) (print (literal string "zero")))
【0036】つぎに、抽象構文木に対する再帰的処理に
ついて説明する。図3に、抽象構文木の処理の流れ図を
示す。図中、ステップS01 において、まず処理の対象
となる抽象構文木のタグを調べることによって、それが
リテラルかそれ以外の構文かを判定する。リテラルの場
合は ステップS02 、一方、構文の場合は ステップS0
3 に移る。ステップS02 においては、抽象構文木のノ
ードのリテラルタグを調べ、その中身にしたがって分岐
し、それぞれのリテラルの種類ごとに、個別に必要な処
理(ステップS021、S022、‥‥)を行う。ただし、リ
テラル用個別処理が必要ないリテラルに対しては、「そ
の他のリテラルの処理」を行う場所に分岐し、その他の
リテラルに対する一般的処理(ステップS02j)を行
う。ステップS03 においては、抽象構文木のノードの
タグを調べ、その中身にしたがって分岐し、構文の種類
ごとに個別に必要な処理(ステップS031、S032、‥
‥)を行う。ただし、構文用個別処理が必要ない構文に
対しては、「その他の構文の処理」を行う場所に分岐
し、その他の構文に対する一般的処理(ステップS0
3k)を行う。 ここで、構文の場合は、ステップS04
に移る。ステップS04においては、処理中の抽象構文木
が持つサブツリーすべてに対して、再帰的にステップS
01 から処理を行う。
ついて説明する。図3に、抽象構文木の処理の流れ図を
示す。図中、ステップS01 において、まず処理の対象
となる抽象構文木のタグを調べることによって、それが
リテラルかそれ以外の構文かを判定する。リテラルの場
合は ステップS02 、一方、構文の場合は ステップS0
3 に移る。ステップS02 においては、抽象構文木のノ
ードのリテラルタグを調べ、その中身にしたがって分岐
し、それぞれのリテラルの種類ごとに、個別に必要な処
理(ステップS021、S022、‥‥)を行う。ただし、リ
テラル用個別処理が必要ないリテラルに対しては、「そ
の他のリテラルの処理」を行う場所に分岐し、その他の
リテラルに対する一般的処理(ステップS02j)を行
う。ステップS03 においては、抽象構文木のノードの
タグを調べ、その中身にしたがって分岐し、構文の種類
ごとに個別に必要な処理(ステップS031、S032、‥
‥)を行う。ただし、構文用個別処理が必要ない構文に
対しては、「その他の構文の処理」を行う場所に分岐
し、その他の構文に対する一般的処理(ステップS0
3k)を行う。 ここで、構文の場合は、ステップS04
に移る。ステップS04においては、処理中の抽象構文木
が持つサブツリーすべてに対して、再帰的にステップS
01 から処理を行う。
【0037】すなわち、リテラル又は構文のいずれかの
タグの種類によって、同様に、個別処理又はその他の一
般的処理を実行する。サブツリーがさらに抽象構文木を
有する場合は、更にこのさらなる抽象構文木に含まれる
全てのサブツリーに対して、階層的に処理を繰り返し、
抽象構文木の終端まで、同様の処理を実行する。木構造
の終端は、ノードがリテラルである場合に、判断するこ
とができる。図3に示したような抽象構文木に対する再
帰的処理の一般的な流れを、疑似コードで現わすと、以
下のようになる。
タグの種類によって、同様に、個別処理又はその他の一
般的処理を実行する。サブツリーがさらに抽象構文木を
有する場合は、更にこのさらなる抽象構文木に含まれる
全てのサブツリーに対して、階層的に処理を繰り返し、
抽象構文木の終端まで、同様の処理を実行する。木構造
の終端は、ノードがリテラルである場合に、判断するこ
とができる。図3に示したような抽象構文木に対する再
帰的処理の一般的な流れを、疑似コードで現わすと、以
下のようになる。
【0038】 抽象構文木 T に対する処理手続きAの定義{ T のタグを見て分岐: "literal" の場合{ T のリテラルタグを見て分岐 "int" の場合 { T を整数リテラルとして処理 } "string" の場合 { T を文字列リテラルとして処理 } ...(省略)... その他の場合 { その他のリテラルに対する一般的処理 } } その他の場合{ T のタグを見て分岐: "if" の場合 { T を if 文として処理 } "while" の場合 { T を while 文として処理 } ...(省略)... その他の場合 { その他の構文に対する一般的処理 } T の各サブツリーに対して、 再帰的に処理手続きAを呼ぶ } }
【0039】再帰呼び出しの停止条件は、ツリーのタグ
が "literal" かどうかだけで決まるため、処理対象の
言語がどのようなリテラルを持つかということには依存
しない。また、構文のサブツリーに対する再帰呼び出し
は、無条件に引数の数だけ再帰呼び出しをするだけでよ
く、構文の種類には依存しない。したがって、将来の言
語仕様拡張で、新たなリテラルや構文が追加された場合
でも、この処理ルーチンは全く変更の必要がない。
が "literal" かどうかだけで決まるため、処理対象の
言語がどのようなリテラルを持つかということには依存
しない。また、構文のサブツリーに対する再帰呼び出し
は、無条件に引数の数だけ再帰呼び出しをするだけでよ
く、構文の種類には依存しない。したがって、将来の言
語仕様拡張で、新たなリテラルや構文が追加された場合
でも、この処理ルーチンは全く変更の必要がない。
【0040】つぎに、抽象構文木に対する処理手続きの
例として、ソースコード中に if 文が現れる回数を数え
る手続き(countIf (T))を疑似コードで書くと以下の
ようになる。
例として、ソースコード中に if 文が現れる回数を数え
る手続き(countIf (T))を疑似コードで書くと以下の
ようになる。
【0041】 手続き countIf (T){ T のタグを見て分岐: "literal" の場合{ 何もしない } その他の場合 { T のタグが "if" の場合{ counter := counter + 1; } T のサブツリーのすべて(Ti とする)に対して、 再帰的に countIf(Ti) を呼ぶ } }
【0042】ここで、言語仕様に次のような構文が追加
されたとする。 repeat 文: (repeat <本体> <条件式>) この場合、従来技術では、 repeat 文を処理する部分を
追加する必要があった。しかし上記の手続きの場合、 r
epeat 文に対する処理は、「その他の構文に対する処
理」だけで対処可能なので、一切変更しなくても正しく
動作する。なお、本フォーマットを用いると、 if 文の
else 部ように、省略可能なサブツリーを持つ構文の処
理記述も簡単になる。上述のように、従来の方法による
抽象構文木のフォーマット例の場合、else部が省略され
たかそうでないかによって、場合分けを行なって処理す
る必要があった。しかし、本フォーマットでは、もとも
とサブツリーの数が可変個として扱われているため、そ
のような場合分けの必要はない。つまり、 if 文に els
e 部が指定されている場合はサブツリーの数は2個、el
se部が省略されている場合はサブツリーの数は3個のノ
ードとして表現され、特に場合わけしなくても再帰的処
理が行なえる。
されたとする。 repeat 文: (repeat <本体> <条件式>) この場合、従来技術では、 repeat 文を処理する部分を
追加する必要があった。しかし上記の手続きの場合、 r
epeat 文に対する処理は、「その他の構文に対する処
理」だけで対処可能なので、一切変更しなくても正しく
動作する。なお、本フォーマットを用いると、 if 文の
else 部ように、省略可能なサブツリーを持つ構文の処
理記述も簡単になる。上述のように、従来の方法による
抽象構文木のフォーマット例の場合、else部が省略され
たかそうでないかによって、場合分けを行なって処理す
る必要があった。しかし、本フォーマットでは、もとも
とサブツリーの数が可変個として扱われているため、そ
のような場合分けの必要はない。つまり、 if 文に els
e 部が指定されている場合はサブツリーの数は2個、el
se部が省略されている場合はサブツリーの数は3個のノ
ードとして表現され、特に場合わけしなくても再帰的処
理が行なえる。
【0043】また、処理効率向上等の目的で、あらかじ
め固定個の種類のノードを、特別なフォーマットを持っ
たノードとして定義しておいても、本発明の特長を損な
うことはない。例えば、 X という名前の識別子(変数
名など)を(identifier "X")といったノードで表現する
場合を考える。この場合再帰呼び出しの停止条件の判定
は、タグが "literal" かどうかだけでなく identifier
かどうかも調べなければならない。この場合、例え
ば、図3ステップS01の前又は後に identifier であ
るかどうかの判断ステップを追加し、さらに、その処理
を追加することにより実行することができる。例えば i
f文の数を数える処理手順は、次のようになる。
め固定個の種類のノードを、特別なフォーマットを持っ
たノードとして定義しておいても、本発明の特長を損な
うことはない。例えば、 X という名前の識別子(変数
名など)を(identifier "X")といったノードで表現する
場合を考える。この場合再帰呼び出しの停止条件の判定
は、タグが "literal" かどうかだけでなく identifier
かどうかも調べなければならない。この場合、例え
ば、図3ステップS01の前又は後に identifier であ
るかどうかの判断ステップを追加し、さらに、その処理
を追加することにより実行することができる。例えば i
f文の数を数える処理手順は、次のようになる。
【0044】手続き countIf (T){ T のタグを見て分岐: "literal" の場合{ 何もしない } "identifier" の場合{ 何もしない } その他の場合 { T のタグが "if" の場合{ counter := counter + 1; } T のサブツリーのすべて(Ti とする)に対して、 再帰的に countIf(Ti) を呼ぶ } }
【0045】しかし、この場合でも、「その他の場合の
処理方法」が定義されているため、将来新たなリテラル
や構文が追加されても、処理プログラムに変更を加える
必要はない。さらに、ツリーの各ノードに、型情報、行
番号情報などの付加情報を格納する場所をあらかじめ設
けても良い。
処理方法」が定義されているため、将来新たなリテラル
や構文が追加されても、処理プログラムに変更を加える
必要はない。さらに、ツリーの各ノードに、型情報、行
番号情報などの付加情報を格納する場所をあらかじめ設
けても良い。
【0046】(3)ノードの構造の他の例 つぎに、ノードの構造の他の実施の形態について説明す
る。図4に、 C, Pascal などの言語において、構造体
と配列を用いて抽象構文木を表現する場合のデータ構造
の説明図を示したものである。図4(a)は、リテラ
ル、図4(b)は、構文を表現するデータ構造である。
図4(a)は、タグ、リテラルタグ、リテラルの中身
(内容)へのポインタ、という3つのデータからなる構
造体である。タグとリテラルタグは、それぞれどの種類
のノードであるかがわかるような値(文字列あるいはハ
ッシュ表のエントリ番号など)が入る。リテラルの中身
は、実際には文字列へのポインタにより示される。図4
(b)は、タグ、数値 N 、サブツリー配列へのポイン
タの3つのデータからなる構造体である。タグは、図4
(a)と同様、ノードの種類を区別するための値が入
る。N は、このノードが持つサブツリーの数を入れる。
サブツリー配列へのポインタは、長さ N の配列を指し
ている。このサブツリー配列の各要素は、それぞれがサ
ブツリーを表す構造体へのポインタである。ただし、サ
ブツリー数Nを保持するかわりに、サブツリー配列にデ
ータの終了を示す値を入れることにより、サブツリー数
Nをあとから数えられるようにしてもよい。
る。図4に、 C, Pascal などの言語において、構造体
と配列を用いて抽象構文木を表現する場合のデータ構造
の説明図を示したものである。図4(a)は、リテラ
ル、図4(b)は、構文を表現するデータ構造である。
図4(a)は、タグ、リテラルタグ、リテラルの中身
(内容)へのポインタ、という3つのデータからなる構
造体である。タグとリテラルタグは、それぞれどの種類
のノードであるかがわかるような値(文字列あるいはハ
ッシュ表のエントリ番号など)が入る。リテラルの中身
は、実際には文字列へのポインタにより示される。図4
(b)は、タグ、数値 N 、サブツリー配列へのポイン
タの3つのデータからなる構造体である。タグは、図4
(a)と同様、ノードの種類を区別するための値が入
る。N は、このノードが持つサブツリーの数を入れる。
サブツリー配列へのポインタは、長さ N の配列を指し
ている。このサブツリー配列の各要素は、それぞれがサ
ブツリーを表す構造体へのポインタである。ただし、サ
ブツリー数Nを保持するかわりに、サブツリー配列にデ
ータの終了を示す値を入れることにより、サブツリー数
Nをあとから数えられるようにしてもよい。
【0047】この抽象構文木をJava 言語を用いて表現
する場合は、基本的には C, Pascal言語を用いる場合
と同じである。ただし、構造体の変わりにオブジェクト
を用いることになる。また、サブツリー配列の長さはも
ともと Java 言語処理系が保持しているので、オブジェ
クトのメンバとしてあらためて保持する必要はない。
する場合は、基本的には C, Pascal言語を用いる場合
と同じである。ただし、構造体の変わりにオブジェクト
を用いることになる。また、サブツリー配列の長さはも
ともと Java 言語処理系が保持しているので、オブジェ
クトのメンバとしてあらためて保持する必要はない。
【0048】今までの説明ではリテラルを表すノードは
サブツリーを持っていなかったが、リテラルを表すノー
ドに対しても長さ0のサブツリーを持たせ、構文とリテ
ラルのフォーマットを統一することで、再帰的処理をさ
らに簡単にすることができる。図5に、リテラルと構文
のデータ構造の共通部分を増やした場合のノード構造図
を示す。ただしこの図は構造体と配列を用いた場合の図
である。このように、本発明では、先頭の3つのデータ
が、リテラルと構文で統一されるため、処理がより容易
になる。このようなフォーマットを採用した場合、ソー
スコード中に if 文が現れる回数を数える手続きの疑似
コードは、以下のようになる。
サブツリーを持っていなかったが、リテラルを表すノー
ドに対しても長さ0のサブツリーを持たせ、構文とリテ
ラルのフォーマットを統一することで、再帰的処理をさ
らに簡単にすることができる。図5に、リテラルと構文
のデータ構造の共通部分を増やした場合のノード構造図
を示す。ただしこの図は構造体と配列を用いた場合の図
である。このように、本発明では、先頭の3つのデータ
が、リテラルと構文で統一されるため、処理がより容易
になる。このようなフォーマットを採用した場合、ソー
スコード中に if 文が現れる回数を数える手続きの疑似
コードは、以下のようになる。
【0049】 手続き countIf (T){ T のタグが "if" の場合{ counter := counter + 1 } T のサブツリーのすべて(Ti とする)に対して、 再帰的に countIf(Ti) を呼ぶ } T がリテラルかどうかを調べる手順が省略できるため、
処理がより簡単になる。
処理がより簡単になる。
【0050】(4)拡張可能プリプロセッサへの応用例 本発明の応用例として、「拡張可能プリプロセッサ」に
ついて説明する。プリプロセッサとは、プログラミング
言語のソースコードを入力とし受け取り、それに対して
なんらかの変換処理を施した後、再びソースコードの形
で出力するプログラムである。この拡張可能プリプロセ
ッサは、プラグインと呼ばれる拡張部品を追加すること
で、Java 言語に新しい構文や機能を追加できる。
ついて説明する。プリプロセッサとは、プログラミング
言語のソースコードを入力とし受け取り、それに対して
なんらかの変換処理を施した後、再びソースコードの形
で出力するプログラムである。この拡張可能プリプロセ
ッサは、プラグインと呼ばれる拡張部品を追加すること
で、Java 言語に新しい構文や機能を追加できる。
【0051】図6に、拡張可能プリプロセッサの構成図
を示す。この拡張可能プリプロセッサ100は、字句解
析部10、構文解析部20、処理部30、出力部40を
備える。字句解析部10は、文字列を構文解析しやすい
形に切り出し区切りをつける処理を行う部分であり、入
力ソースコードに基づいてトークン列に解析する。構文
解析部20は、字句解析器により解析されたトークン列
から、リテラル又は構文をノードとして有する木構造で
表現し、ノードがリテラル又は構文であることを示すタ
グを含むデータとして表現した抽象構文木に解析する。
構文解析部20は、文法拡張部品(プラグイン)51〜
53を追加して文法を拡張することによって、新たなリ
テラルタグを持つリテラル又は新たなタグを持つ構文を
含む抽象構文木を生成する機能を有する。
を示す。この拡張可能プリプロセッサ100は、字句解
析部10、構文解析部20、処理部30、出力部40を
備える。字句解析部10は、文字列を構文解析しやすい
形に切り出し区切りをつける処理を行う部分であり、入
力ソースコードに基づいてトークン列に解析する。構文
解析部20は、字句解析器により解析されたトークン列
から、リテラル又は構文をノードとして有する木構造で
表現し、ノードがリテラル又は構文であることを示すタ
グを含むデータとして表現した抽象構文木に解析する。
構文解析部20は、文法拡張部品(プラグイン)51〜
53を追加して文法を拡張することによって、新たなリ
テラルタグを持つリテラル又は新たなタグを持つ構文を
含む抽象構文木を生成する機能を有する。
【0052】処理部30は、構文解析部20により解析
された抽象構文木の各ノードを、タグに基づいて、リテ
ラルデータであるか構文データであるかを判定し、その
判定結果に応じて、リテラルデータ及び構文データ及び
構文に含まれるすべてのサブツリーのリテラルデータ並
びに構文データについて、対応する個別処理又は一般的
処理を再帰的に実行する(図3参照)。処理部30は、
他のタグ情報に基づいてリテラルデータ及び構文データ
以外の他のデータ(例えば、上述のidentifierの例を参
照。)であると判定し、判定結果に対応する個別処理を
実行する処理器をさらに備えることができる。プラグイ
ン51〜53によって構文解析部20に変更が加えら
れ、入力ソースコードの文法が拡張されても、その文法
拡張が処理に本質的に影響を与えるものでない限り、処
理部30のプログラムは変更せずにそのまま再利用する
ことができる。出力部40は、処理部30により求めら
れた抽象構文木を再び文字列に変換した出力ソースコー
ドを出力する。
された抽象構文木の各ノードを、タグに基づいて、リテ
ラルデータであるか構文データであるかを判定し、その
判定結果に応じて、リテラルデータ及び構文データ及び
構文に含まれるすべてのサブツリーのリテラルデータ並
びに構文データについて、対応する個別処理又は一般的
処理を再帰的に実行する(図3参照)。処理部30は、
他のタグ情報に基づいてリテラルデータ及び構文データ
以外の他のデータ(例えば、上述のidentifierの例を参
照。)であると判定し、判定結果に対応する個別処理を
実行する処理器をさらに備えることができる。プラグイ
ン51〜53によって構文解析部20に変更が加えら
れ、入力ソースコードの文法が拡張されても、その文法
拡張が処理に本質的に影響を与えるものでない限り、処
理部30のプログラムは変更せずにそのまま再利用する
ことができる。出力部40は、処理部30により求めら
れた抽象構文木を再び文字列に変換した出力ソースコー
ドを出力する。
【0053】
【発明の効果】以上のように、本発明によると、規定す
るフォーマットとその再帰処理方法を採用することによ
り、入力するプログラミング言語の仕様に変更があって
も(例えば、新たなリテラルや構文が追加されても)、
その変更が本質的に影響を及ぼさない処理である限り、
ソースコードに処理を施すプログラムを特に変更しなく
ても、その処理のソースコードの大部分は変更せずにそ
のまま利用できるようにすることができる。また、本発
明によると、将来の言語仕様拡張でどのようなリテラル
や構文が追加されるかは全く予測できないような状況に
おいても、基本的なフォーマットを変更せずに表現でき
る抽象構文木のデータ構造を提供することができる。ま
た、本発明によると、これによって、その抽象構文木に
対して操作を施すプログラムは、構文が拡張されても変
更せずに再利用することができる。なお、本発明が規定
するフォーマットを用いることによって、おそらく、考
えられるほとんどのすべてのプログラミング言語のソー
スコードを表現することができる。
るフォーマットとその再帰処理方法を採用することによ
り、入力するプログラミング言語の仕様に変更があって
も(例えば、新たなリテラルや構文が追加されても)、
その変更が本質的に影響を及ぼさない処理である限り、
ソースコードに処理を施すプログラムを特に変更しなく
ても、その処理のソースコードの大部分は変更せずにそ
のまま利用できるようにすることができる。また、本発
明によると、将来の言語仕様拡張でどのようなリテラル
や構文が追加されるかは全く予測できないような状況に
おいても、基本的なフォーマットを変更せずに表現でき
る抽象構文木のデータ構造を提供することができる。ま
た、本発明によると、これによって、その抽象構文木に
対して操作を施すプログラムは、構文が拡張されても変
更せずに再利用することができる。なお、本発明が規定
するフォーマットを用いることによって、おそらく、考
えられるほとんどのすべてのプログラミング言語のソー
スコードを表現することができる。
【図1】ノードの構造の説明図。
【図2】本発明による表現を用いた抽象構文木の説明
図。
図。
【図3】抽象構文木の処理の流れ図。
【図4】構造体と配列を用いて抽象構文木を表現する場
合のデータ構造の説明図。
合のデータ構造の説明図。
【図5】リテラルと構文のデータ構造の共通部分を増や
した場合のノード構造図。
した場合のノード構造図。
【図6】拡張可能プリプロセッサの構成図。
【図7】従来のプリプロセッサによる処理の流れ図。
【図8】従来の抽象構文木の構成図。
100 拡張可能プリプロセッサ 10 字句解析部 20 構文解析部 30 処理部 40 出力部 51〜53 プラグイン
───────────────────────────────────────────────────── フロントページの続き (56)参考文献 月刊ジャバワールド、IDGコミュニ ケーションズ、第2巻だ2号、p.87− 90 情報処理学会第46回(平成5年前期) 全国大会講演論文集、p.4−1 − 4−2 A.Vエイホ他著、原田賢一訳、「コ ンパイラ ▲I▼ 原理・技法・ツー ル」、株式会社サイエンス社、1990年10 月10日、p.350−358 (58)調査した分野(Int.Cl.6,DB名) G06F 9/45 JICSTファイル(JOIS) (54)【発明の名称】 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒 体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理 装置
Claims (15)
- 【請求項1】リテラル又は構文をノードとして有する木
構造のデータを表現した抽象構文木において、前記抽象
構文木に含まれるあるノードが前記リテラルであるか前
記構文であるかを判定するステップと、 前記ノードがリテラルの場合、前記リテラルの種類を表
すリテラルタグに基づいて、前記リテラルの種類毎にリ
テラル用個別処理が定義されているときは前記リテラル
用個別処理を実行し、前記リテラル用個別処理が定義さ
れていないときはその他のリテラルに対するリテラル用
一般的処理を実行するステップと、 一方、前記ノードが構文の場合、前記構文の種類毎に構
文用個別処理が定義されているときは前記構文用個別処
理を実行し、前記構文用個別処理が定義されていないと
きはその他の構文に対する構文用一般的処理を実行する
ステップと、 処理中の前記構文に含まれるすべてのサブツリーについ
て、ノードがリテラルか構文かに応じて、対応する前記
リテラル用若しくは構文用個別処理又は前記リテラル用
若しくは構文用一般的処理を再帰的に実行するステップ
とを備えた抽象構文木処理方法。 - 【請求項2】前記再帰的に実行するステップは、 木構造を引数にとる手続の場合に、サブツリーを引数と
して再び呼び出して処理を実行することを特徴とする請
求項1に記載の抽象構文木処理方法。 - 【請求項3】前記サブツリーリスト中のノードが、リテ
ラルの場合、前記再帰的に実行するステップの停止条件
とすることを特徴とする請求項1又は2に記載の抽象構
文木処理方法。 - 【請求項4】前記リテラルは、 前記ノードがリテラルであることを示すタグ、前記リテ
ラルの種類を表すリテラルタグ及び前記リテラルの内容
を表すためのリテラル内容の各情報を含むことを特徴と
する請求項1乃至3のいずれかに記載の抽象構文木処理
方法。 - 【請求項5】前記構文は、 前記ノードが構文であることを示すタグ及びサブツリー
数分のサブツリーリストの各情報を含むことを特徴とす
る請求項1乃至4のいずれかに記載の抽象構文木処理方
法。 - 【請求項6】前記構文は、 前記サブツリー数又は前記サブツリー数を計算できるよ
うな情報をさらに含むことを特徴とする請求項1乃至5
のいずれかに記載の抽象構文木処理方法。 - 【請求項7】前記タグは、 前記リテラル又は構文を示す情報の他に、特定の種類の
ノードを示す他のタグ情報をさらに有することを特徴と
する請求項1乃至6のいずれかに記載の抽象構文木処理
方法。 - 【請求項8】前記リテラル内容又は前記サブツリーリス
トには、 ポインタが記憶され、前記ポインタにより参照された領
域に前記リテラル又は前記構文の内容が記憶されたこと
を特徴とする請求項1乃至7のいずれかに記載の抽象構
文木処理方法。 - 【請求項9】リテラルの場合、特定領域にリテラルタグ
として特定の数値又は数値でない文字が記憶され、 構文の場合、前記特定領域にサブツリー数として前記特
定の数値以外の個数を示す数値又は文字が記憶され、 前記特定領域を参照することにより、当該ノードが前記
リテラル又は前記構文かが判定されることを特徴とする
請求項1乃至8のいずれかに記載の抽象構文木処理方
法。 - 【請求項10】リテラル又は構文をノードとして有する
木構造のデータを表現した抽象構文木において、前記抽
象構文木に含まれるあるノードが前記リテラルであるか
前記構文であるかを判定するステップと、 前記ノードがリテラルの場合、前記リテラルの種類を表
すリテラルタグに基づいて、前記リテラルの種類毎にリ
テラル用個別処理が定義されているときは前記リテラル
用個別処理を実行し、前記リテラル用個別処理が定義さ
れていないときはその他のリテラルに対するリテラル用
一般的処理を実行するステップと、 一方、前記ノードが構文の場合、前記構文の種類毎に構
文用個別処理が定義されているときは前記構文用個別処
理を実行し、前記構文用個別処理が定義されていないと
きはその他の構文に対する構文用一般的処理を実行する
ステップと、 処理中の前記構文に含まれるすべてのサブツリーについ
て、ノードがリテラルか構文かに応じて、対応する前記
リテラル用若しくは構文用個別処理又は前記リテラル用
若しくは構文用一般的処理を再帰的に実行するステップ
とを備えた抽象構文木処理プログラムを記録したコンピ
ュータ読み取り可能な記録媒体。 - 【請求項11】リテラル又は構文をノードとして有する
木構造で表現した抽象構文木データを記録したコンピュ
ータ読み取り可能な記録媒体であって、 前記ノードがリテラルであることを示すタグ、前記リテ
ラルの種類を表すリテラルタグ及び前記リテラルの内容
を表すためのリテラル内容の各領域を含むリテラルデー
タと、 前記ノードが構文であることを示すタグ及びサブツリー
数分のサブツリーリストの各領域を含む構文データとを
備え、 前記抽象構文木データを各ノードについての前記リテラ
ルデータ及び前記構文データによる木構造で表現し、 前記抽象構文木のノードは、前記タグに基づいて前記リ
テラルデータであるか前記構文データであるかが判定さ
れ、その判定結果に応じて、前記リテラルデータ及び前
記構文データ及び前記構文に含まれるすべてのサブツリ
ーリスト中の前記リテラルデータ並びに前記構文データ
について、対応する個別処理又は一般的処理が再帰的に
実行される抽象構文木データを記録したコンピュータ読
み取り可能な記録媒体。 - 【請求項12】前記構文データは、 前記サブツリー数又は前記サブツリー数を計算できるよ
うな情報をさらに含むことを特徴とする請求項11に記
載の抽象構文木データを記録したコンピュータ読み取り
可能な記録媒体。 - 【請求項13】入力ソースコードに基づいてトークン列
に解析する字句解析部と、 前記字句解析器により解析された前記トークン列から、
前記リテラル又は前記構文をノードとして有する木構造
で表現し、前記ノードがリテラル又は構文であることを
示すタグを含むデータとして表現した抽象構文木に解析
する構文解析部と、 前記構文解析器により解析された前記抽象構文木の各ノ
ードを、前記タグに基づいて、前記リテラルデータであ
るか前記構文データであるかを判定し、その判定結果に
応じて、前記リテラルデータ及び前記構文データ及び前
記構文に含まれるすべてのサブツリーの前記リテラルデ
ータ並びに前記構文データについて、対応する個別処理
又は一般的処理を再帰的に実行する処理部と、 前記処理部により求められた前記抽象構文木を文字列に
変換した出力ソースコードを出力する出力部とを備えた
抽象構文木処理装置。 - 【請求項14】前記構文解析器は、 前記ノードがリテラル又は構文であるかを示すタグ以外
の特定種類のノードを示す他のタグ情報を判定するため
の解析器をさらに備えたことを特徴とする請求項13に
記載の抽象構文木処理装置。 - 【請求項15】前記処理部は、 前記他のタグ情報に基づいて、前記リテラルデータ及び
前記構文データ以外の他のデータであると判定し、その
判定結果に対応する個別処理を実行する処理器をさらに
備えたことを特徴とする請求項13又は14に記載の抽
象構文木処理装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP6205598A JP2879099B1 (ja) | 1998-02-26 | 1998-02-26 | 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP6205598A JP2879099B1 (ja) | 1998-02-26 | 1998-02-26 | 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2879099B1 true JP2879099B1 (ja) | 1999-04-05 |
JPH11249903A JPH11249903A (ja) | 1999-09-17 |
Family
ID=13189090
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP6205598A Expired - Lifetime JP2879099B1 (ja) | 1998-02-26 | 1998-02-26 | 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2879099B1 (ja) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110704053A (zh) * | 2019-09-03 | 2020-01-17 | 五八有限公司 | 一种样式信息的处理方法及装置 |
CN111124414A (zh) * | 2019-12-02 | 2020-05-08 | 东巽科技(北京)有限公司 | 一种基于操作链接的抽象语法树取词方法 |
CN111475809A (zh) * | 2020-04-09 | 2020-07-31 | 杭州奇盾信息技术有限公司 | 脚本混淆检测方法、装置、计算机设备和存储介质 |
CN116954622A (zh) * | 2023-09-18 | 2023-10-27 | 北京云枢创新软件技术有限公司 | 抽象语法树和源代码坐标的关联方法、电子设备和介质 |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6941524B2 (en) | 2002-05-24 | 2005-09-06 | International Business Machines Corporation | System and method for displaying a recursive relationship between objects in a tree |
JP4553246B2 (ja) * | 2004-11-26 | 2010-09-29 | 富士通株式会社 | ウェブ画面作成方法、プログラム及びサーバ |
JP5413623B2 (ja) * | 2009-08-25 | 2014-02-12 | 日本電気株式会社 | アセンブル装置、構文解析方法、及びアセンブラプログラム |
US8464234B2 (en) * | 2011-10-24 | 2013-06-11 | Google Inc. | Pre-parsed headers for compilation |
JP5932707B2 (ja) * | 2013-04-18 | 2016-06-08 | 株式会社日立製作所 | 計算機、プログラム及びデータ生成方法 |
-
1998
- 1998-02-26 JP JP6205598A patent/JP2879099B1/ja not_active Expired - Lifetime
Non-Patent Citations (3)
Title |
---|
A.Vエイホ他著、原田賢一訳、「コンパイラ ▲I▼ 原理・技法・ツール」、株式会社サイエンス社、1990年10月10日、p.350−358 |
情報処理学会第46回(平成5年前期)全国大会講演論文集、p.4−1 − 4−2 |
月刊ジャバワールド、IDGコミュニケーションズ、第2巻だ2号、p.87−90 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110704053A (zh) * | 2019-09-03 | 2020-01-17 | 五八有限公司 | 一种样式信息的处理方法及装置 |
CN110704053B (zh) * | 2019-09-03 | 2023-05-23 | 五八有限公司 | 一种样式信息的处理方法及装置 |
CN111124414A (zh) * | 2019-12-02 | 2020-05-08 | 东巽科技(北京)有限公司 | 一种基于操作链接的抽象语法树取词方法 |
CN111124414B (zh) * | 2019-12-02 | 2024-02-06 | 东巽科技(北京)有限公司 | 一种基于操作链接的抽象语法树取词方法 |
CN111475809A (zh) * | 2020-04-09 | 2020-07-31 | 杭州奇盾信息技术有限公司 | 脚本混淆检测方法、装置、计算机设备和存储介质 |
CN111475809B (zh) * | 2020-04-09 | 2023-10-20 | 杭州奇盾信息技术有限公司 | 脚本混淆检测方法、装置、计算机设备和存储介质 |
CN116954622A (zh) * | 2023-09-18 | 2023-10-27 | 北京云枢创新软件技术有限公司 | 抽象语法树和源代码坐标的关联方法、电子设备和介质 |
CN116954622B (zh) * | 2023-09-18 | 2023-12-15 | 北京云枢创新软件技术有限公司 | 抽象语法树和源代码坐标的关联方法、电子设备和介质 |
Also Published As
Publication number | Publication date |
---|---|
JPH11249903A (ja) | 1999-09-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Wirth et al. | Compiler construction | |
US5680622A (en) | System and methods for quickly detecting shareability of symbol and type information in header files | |
US9710243B2 (en) | Parser that uses a reflection technique to build a program semantic tree | |
US8423978B2 (en) | Configurable java server pages processing framework | |
US6859810B2 (en) | Declarative specification and engine for non-isomorphic data mapping | |
US20040103405A1 (en) | System for translating programming languages | |
Scott et al. | GLL parse-tree generation | |
JPS61103247A (ja) | 翻訳プログラム作成システム | |
US20040243980A1 (en) | Methods for enhancing pointer analyses | |
US20110271250A1 (en) | Software Development Tool | |
JP2012063868A (ja) | 言語処理パーサーを組み合わせて、組み合わせパーサーを生成する方法、並びにそのコンピュータ及びコンピュータ・プログラム | |
US20040154009A1 (en) | Structuring program code | |
CN113741869B (zh) | 一种高性能的可变语法编程语言的构造方法 | |
US5701490A (en) | Method and apparatus for compiler symbol table organization with no lookup in semantic analysis | |
JP2879099B1 (ja) | 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置 | |
EP0520708B1 (en) | Method and apparatus for converting high level form abstract syntaxes into an intermediate form | |
US20080141230A1 (en) | Scope-Constrained Specification Of Features In A Programming Language | |
US20030233640A1 (en) | Structuring program code | |
US20070050705A1 (en) | Method of xml element level comparison and assertion utilizing an application-specific parser | |
RU2115158C1 (ru) | Способ и устройство для достоверной оценки семантических признаков в синтаксическом анализе при проходе вперед слева направо | |
Gondow et al. | Towards ANSI C program slicing using XML | |
KR102614967B1 (ko) | 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법 | |
CN113568678B (zh) | 一种动态加载资源的方法、装置及电子设备 | |
US20030009744A1 (en) | Source code line counting system and method | |
JPH07182179A (ja) | オブジェクト指向データベース管理装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
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 |