JP3370243B2 - コンパイル方法及び装置 - Google Patents
コンパイル方法及び装置Info
- Publication number
- JP3370243B2 JP3370243B2 JP29457696A JP29457696A JP3370243B2 JP 3370243 B2 JP3370243 B2 JP 3370243B2 JP 29457696 A JP29457696 A JP 29457696A JP 29457696 A JP29457696 A JP 29457696A JP 3370243 B2 JP3370243 B2 JP 3370243B2
- Authority
- JP
- Japan
- Prior art keywords
- token
- syntax
- analysis unit
- operation mode
- syntax rule
- 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 - Fee Related
Links
Landscapes
- Devices For Executing Special Programs (AREA)
Description
【0001】
【発明の属する利用分野】本発明は、プログラミング言
語コンパイラにおけるコンパイル方法に係り、特に、字
句解析部がソースプログラムから文字列をトークンとし
て切り出し、構文解析部がトークンの並びを解析する構
文解析系における方法に関する。
語コンパイラにおけるコンパイル方法に係り、特に、字
句解析部がソースプログラムから文字列をトークンとし
て切り出し、構文解析部がトークンの並びを解析する構
文解析系における方法に関する。
【0002】
【従来の技術】一般的なコンパイラは、ソースプログラ
ムから文字列を切り出してトークンを生成する字句解析
部、トークン間の並びを解析してプログラミング言語の
文法に従っているかどうか調べ、中間語と呼ばれる内部
形式に変換する構文解析部、プログラムの意味情報の収
集、検査を行う意味解析部、中間語の最適化を行う最適
化部、実行可能コードを生成するオブジェクトコード出
力部で構成される。ここでトークンとは、ソースプログ
ラムから意味のある最小の字句を切り出して1つの単位
としてまとめたものである。たとえば、ある字句解析部
はX1=X2というソースプログラムから、変数名、等
号、変数名という3つのトークンを生成する。トークン
は、そのトークンを生成するもとになったソースプログ
ラム上の字句(前出の例では“X1”,“=”,“X2”)
や、ソースプログラム上での位置(行数、カラム数)な
どを属性値として持つ。文法は、プログラミング言語の
構文を規定するものである。以下、単に文法と記した場
合、文脈自由文法のことを指す。ただし本発明はコンパ
イラの構成に関するものであり、文脈自由文法は説明の
ために使用するにすぎない。
ムから文字列を切り出してトークンを生成する字句解析
部、トークン間の並びを解析してプログラミング言語の
文法に従っているかどうか調べ、中間語と呼ばれる内部
形式に変換する構文解析部、プログラムの意味情報の収
集、検査を行う意味解析部、中間語の最適化を行う最適
化部、実行可能コードを生成するオブジェクトコード出
力部で構成される。ここでトークンとは、ソースプログ
ラムから意味のある最小の字句を切り出して1つの単位
としてまとめたものである。たとえば、ある字句解析部
はX1=X2というソースプログラムから、変数名、等
号、変数名という3つのトークンを生成する。トークン
は、そのトークンを生成するもとになったソースプログ
ラム上の字句(前出の例では“X1”,“=”,“X2”)
や、ソースプログラム上での位置(行数、カラム数)な
どを属性値として持つ。文法は、プログラミング言語の
構文を規定するものである。以下、単に文法と記した場
合、文脈自由文法のことを指す。ただし本発明はコンパ
イラの構成に関するものであり、文脈自由文法は説明の
ために使用するにすぎない。
【0003】文法は次の4つの要素からなる。
1.トークンの集合
2.非終端記号の集合
3.構文規則の集合
各構文規則は、構文規則の左辺と呼ばれる非終端記号、
→、構文規則の右辺と呼ばれるトークンや非終端記号の
列からなる。 4.開始記号と呼ぶ1つの非終端記号 文法を構成する構文規則のうち最上位の規則の左辺を開
始記号とする。文法は構文規則の並びによって定められ
る。たとえば、数字、正符号及び負符号からなる式の文
法は次の構文規則((1),(2),(3),(4))
の並びとして表すことができる。 式→式+数字………(1) 式→式−数字………(2) 式→数字……………(3) 数字→0|1|2|3|4|5|6|7|8|9……(4) ここで、式、数字のように構文規則の左辺に現れるもの
は非終端記号であり、+,−,0〜9のように構文規則
の右辺にしか現れないものはトークンである。構文規則
(1)の意味は、「式は式+数字という記号列から構成さ
れる」ということである。構文規則(4)の意味は、「数
字は0または1または...9で構成される」ということ
である。構文規則(4)の右辺の記号“|”は「または」
を表す記号である。上記(1)〜(4)において、
“式”、“数字”は非終端記号であり、“+”、
“−”、“0”、“1”、………、“9”はトークンで
あり、“→”は記号である。また、上記(1)の左辺の
“式”は開始記号である。
→、構文規則の右辺と呼ばれるトークンや非終端記号の
列からなる。 4.開始記号と呼ぶ1つの非終端記号 文法を構成する構文規則のうち最上位の規則の左辺を開
始記号とする。文法は構文規則の並びによって定められ
る。たとえば、数字、正符号及び負符号からなる式の文
法は次の構文規則((1),(2),(3),(4))
の並びとして表すことができる。 式→式+数字………(1) 式→式−数字………(2) 式→数字……………(3) 数字→0|1|2|3|4|5|6|7|8|9……(4) ここで、式、数字のように構文規則の左辺に現れるもの
は非終端記号であり、+,−,0〜9のように構文規則
の右辺にしか現れないものはトークンである。構文規則
(1)の意味は、「式は式+数字という記号列から構成さ
れる」ということである。構文規則(4)の意味は、「数
字は0または1または...9で構成される」ということ
である。構文規則(4)の右辺の記号“|”は「または」
を表す記号である。上記(1)〜(4)において、
“式”、“数字”は非終端記号であり、“+”、
“−”、“0”、“1”、………、“9”はトークンで
あり、“→”は記号である。また、上記(1)の左辺の
“式”は開始記号である。
【0004】たとえば、ある文法Xの1つの構文規則
が、動作モードによってあるときはA、またあるときは
A’になるとする。文法Xに従ってコンパイルを行うコ
ンパイラ(以下文法Xのコンパイラとする)を作成する
場合、外部から与えられた動作モードに従ってあるとき
は構文規則Aを用い、またあるときは構文規則A’を用
いるようにするためには従来の方法では次のように実現
することができる。まず、構文規則A、A’の両方を含
むような文法Yを作る(もし、このような文法Yが作れ
ない場合、従来の方法では実現が難しい)。構文解析部
では文法Yに従ってトークンの並びを解析させる。次に
意味解析部で、構文解析部で受け付けたトークンの並び
が現在選択されている構文規則(AまたはA’)に適し
ているかどうかを検査する。このようにして、あるとき
は構文規則A、またあるときは構文規則A’を含む文法
Xのコンパイラを作成することができる。しかしこの方
法では、構文解析部だけでなく意味解析部においても構
文のチェックを行わなければならず、コンパイラの構成
が複雑になる。このため、数多くの構文規則を切り替え
て適用しなければならないような、規模の大きなコンパ
イラを作成するのが困難になる。
が、動作モードによってあるときはA、またあるときは
A’になるとする。文法Xに従ってコンパイルを行うコ
ンパイラ(以下文法Xのコンパイラとする)を作成する
場合、外部から与えられた動作モードに従ってあるとき
は構文規則Aを用い、またあるときは構文規則A’を用
いるようにするためには従来の方法では次のように実現
することができる。まず、構文規則A、A’の両方を含
むような文法Yを作る(もし、このような文法Yが作れ
ない場合、従来の方法では実現が難しい)。構文解析部
では文法Yに従ってトークンの並びを解析させる。次に
意味解析部で、構文解析部で受け付けたトークンの並び
が現在選択されている構文規則(AまたはA’)に適し
ているかどうかを検査する。このようにして、あるとき
は構文規則A、またあるときは構文規則A’を含む文法
Xのコンパイラを作成することができる。しかしこの方
法では、構文解析部だけでなく意味解析部においても構
文のチェックを行わなければならず、コンパイラの構成
が複雑になる。このため、数多くの構文規則を切り替え
て適用しなければならないような、規模の大きなコンパ
イラを作成するのが困難になる。
【0005】また、特開平4−55944号に記載され
ている方法で、プログラミング言語の文法の構文規則を
動的に変更できるコンパイラを作成することもできる。
ある文法Xの1つの構文規則があるときはA、またある
ときはA’になるとき、文法Xのコンパイラの作成は次
のように行う。まず、構文規則A、A’をそれぞれ含む
文法Z、Z’を作成する。次に文法Z、Z’の両方を解
析するLR(1)構文解析サブルーチンを作成しておき、
このサブルーチンを呼び出す際に解析すべき文法の種別
(ZまたはZ’)を表すトークンを挿入することにより
目的の文法で解析することが可能になる。しかし、この
方法では、構文解析部の状態遷移の数が少なくとも1回
増えるうえに、字句解析部が文法の種別(Zまたは
Z’)を表すトークンを挿入するとき、次に返すべきト
ークンを保持しなければならなくなる。このため、エラ
ー処理におけるソースプログラムとの同期やエラー回復
の制御が複雑になる。同様の解決手段はGRAY H.
MERRILL,Parsing Non−LR(k)
Grammars with Yacc,SOFTWA
RE−PRACTICE AND EXPERIENC
E.,VOL.23(8),829−850(AUGUS
T 1993)にも記述されている。
ている方法で、プログラミング言語の文法の構文規則を
動的に変更できるコンパイラを作成することもできる。
ある文法Xの1つの構文規則があるときはA、またある
ときはA’になるとき、文法Xのコンパイラの作成は次
のように行う。まず、構文規則A、A’をそれぞれ含む
文法Z、Z’を作成する。次に文法Z、Z’の両方を解
析するLR(1)構文解析サブルーチンを作成しておき、
このサブルーチンを呼び出す際に解析すべき文法の種別
(ZまたはZ’)を表すトークンを挿入することにより
目的の文法で解析することが可能になる。しかし、この
方法では、構文解析部の状態遷移の数が少なくとも1回
増えるうえに、字句解析部が文法の種別(Zまたは
Z’)を表すトークンを挿入するとき、次に返すべきト
ークンを保持しなければならなくなる。このため、エラ
ー処理におけるソースプログラムとの同期やエラー回復
の制御が複雑になる。同様の解決手段はGRAY H.
MERRILL,Parsing Non−LR(k)
Grammars with Yacc,SOFTWA
RE−PRACTICE AND EXPERIENC
E.,VOL.23(8),829−850(AUGUS
T 1993)にも記述されている。
【0006】
【発明が解決しようとする課題】プログラミング言語の
文法の構文規則を動的に変更できるコンパイラを作成す
る場合、従来技術では上記説明のとおり、構文解析部と
意味解析部の役割分担があいまいになるという問題や、
構文解析部の状態遷移の回数が増えるという問題があ
る。本発明の目的は、コンパイラ外部から与えられた動
作モードに応じて構文規則を動的に切り換えるコンパイ
ラの構文解析系を作成する手段を提供することである。
文法の構文規則を動的に変更できるコンパイラを作成す
る場合、従来技術では上記説明のとおり、構文解析部と
意味解析部の役割分担があいまいになるという問題や、
構文解析部の状態遷移の回数が増えるという問題があ
る。本発明の目的は、コンパイラ外部から与えられた動
作モードに応じて構文規則を動的に切り換えるコンパイ
ラの構文解析系を作成する手段を提供することである。
【0007】
【課題を解決するための手段】上記目的を達成するた
め、本発明は、字句解析部と構文解析部を含むプログラ
ミング言語コンパイラであり、字句解析部がソースプロ
グラムから文字列を切り出してトークンとし、構文解析
部が構文規則に従ってトークンの並びを解析し、外部か
ら与えられた動作モードに応じて内部の動作を変更しう
るコンパイラにおいて、あるプログラミング言語の文法
Xに含まれる複数の構文規則から、動作モードによって
該動作モードに対応する構文規則を選択する場合、前記
字句解析部は、前記動作モードにしたがって、特定の文
字列から該動作モードに対応する異なるトークンを生成
し、それぞれの動作モードに対応するトークンを含む複
数の構文規則を有する前記構文解析部に渡し、該構文解
析部は、字句解析部からある特定の動作モードに対応す
るトークンを受理したとき、該トークンを含む構文規則
だけを選択的に適用可能にするようにしている。
め、本発明は、字句解析部と構文解析部を含むプログラ
ミング言語コンパイラであり、字句解析部がソースプロ
グラムから文字列を切り出してトークンとし、構文解析
部が構文規則に従ってトークンの並びを解析し、外部か
ら与えられた動作モードに応じて内部の動作を変更しう
るコンパイラにおいて、あるプログラミング言語の文法
Xに含まれる複数の構文規則から、動作モードによって
該動作モードに対応する構文規則を選択する場合、前記
字句解析部は、前記動作モードにしたがって、特定の文
字列から該動作モードに対応する異なるトークンを生成
し、それぞれの動作モードに対応するトークンを含む複
数の構文規則を有する前記構文解析部に渡し、該構文解
析部は、字句解析部からある特定の動作モードに対応す
るトークンを受理したとき、該トークンを含む構文規則
だけを選択的に適用可能にするようにしている。
【0008】また、字句解析部と構文解析部を含むプロ
グラミング言語コンパイラであり、字句解析部がソース
プログラムから文字列を切り出してトークンとし、構文
解析部が構文規則に従ってトークンの並びを解析し、外
部から与えられた動作モードに応じて内部の動作を変更
しうるコンパイラにおいて、あるプログラミング言語の
文法Xに含まれる構文規則Aを動作モードによって有効
または無効にするために、前記字句解析部は、前記動作
モードにしたがって、特定の文字列から該動作モードに
対応する異なるトークンを生成し、構文規則Aを有する
前記構文解析部に渡し、該構文解析部は、字句解析部か
ら動作モードに対応するトークンを受理したとき、動作
モードに対応するトークンが構文規則Aに含まれていれ
ば構文規則Aを有効とし、含まれていない場合は構文規
則を無効とするようにしている。
グラミング言語コンパイラであり、字句解析部がソース
プログラムから文字列を切り出してトークンとし、構文
解析部が構文規則に従ってトークンの並びを解析し、外
部から与えられた動作モードに応じて内部の動作を変更
しうるコンパイラにおいて、あるプログラミング言語の
文法Xに含まれる構文規則Aを動作モードによって有効
または無効にするために、前記字句解析部は、前記動作
モードにしたがって、特定の文字列から該動作モードに
対応する異なるトークンを生成し、構文規則Aを有する
前記構文解析部に渡し、該構文解析部は、字句解析部か
ら動作モードに対応するトークンを受理したとき、動作
モードに対応するトークンが構文規則Aに含まれていれ
ば構文規則Aを有効とし、含まれていない場合は構文規
則を無効とするようにしている。
【0009】また、前記字句解析部は、変換前のトーク
ンと動作モードと変換後のトークンからなるトークン変
換テーブルを備え、特定の文字列から生成したトークン
を前記トークン変換テーブルにより動作モードに対応す
る異なるトークンに変換するようにしている。
ンと動作モードと変換後のトークンからなるトークン変
換テーブルを備え、特定の文字列から生成したトークン
を前記トークン変換テーブルにより動作モードに対応す
る異なるトークンに変換するようにしている。
【0010】また、初期化部を有し、該初期化部は動作
モードに対応する文字列ID−トークン対応テーブルを
生成し、前記字句解析部は、文字列ID−トークン対応
テーブルにしたがって動作モードに対応する異なるトー
クンを生成するようにしている。
モードに対応する文字列ID−トークン対応テーブルを
生成し、前記字句解析部は、文字列ID−トークン対応
テーブルにしたがって動作モードに対応する異なるトー
クンを生成するようにしている。
【0011】
【発明の実施の形態】以下、本発明の実施例について図
面を用いて説明する。図1は実施例1のプログラミング
言語コンパイラの構成例である。このコンパイラは、ソ
ースプログラムから文字列を切り出してトークンを生成
する字句解析部1、トークン間の並びを解析してプログ
ラミング言語の文法に従っているかどうか調べ、中間語
と呼ばれる内部形式に変換する構文解析部2、意味情報
の収集、検査を行う意味解析部3、中間語の最適化を行
う最適化部4、実行可能コードを生成するオブジェクト
コード出力部5で構成されている。このうち字句解析部
1はトークン生成部6とトークン変換部7に分けられ
る。トークン生成部6は、ソースプログラムから切り出
した文字列からトークンを生成する。トークン変換部7
は、外部から与えられた動作モード(この場合はコンパ
イルオプション)で指定された構文規則選択情報8(動
作モードと等価)と、予め作成され保持されているトー
クン変換テーブル9を基にトークン生成部6で生成され
たトークンを変換する。トークン変換テーブル9はトー
クンをどのように変換すべきかが指定されているテーブ
ルで、例えば図3のように、A欄,B欄,C欄で構成さ
れる。A欄には変換前のトークン、B欄には構文規則選
択情報、C欄には変換後のトークンが入っている。トー
クン変換部7は、トークン生成部6で生成されたトーク
ンをA欄、コンパイルオプションで指定された構文規則
選択情報8を参照してこれをB欄に当てはめたときのC
欄のトークンを出力する。1つのトークンが状況によっ
て異なるトークンに変換されるので、A欄の1つのトー
クンに対してB,C欄は複数存在する。構文解析部2は
C欄のトークンを含む構文規則に従って構文解析を行
う。
面を用いて説明する。図1は実施例1のプログラミング
言語コンパイラの構成例である。このコンパイラは、ソ
ースプログラムから文字列を切り出してトークンを生成
する字句解析部1、トークン間の並びを解析してプログ
ラミング言語の文法に従っているかどうか調べ、中間語
と呼ばれる内部形式に変換する構文解析部2、意味情報
の収集、検査を行う意味解析部3、中間語の最適化を行
う最適化部4、実行可能コードを生成するオブジェクト
コード出力部5で構成されている。このうち字句解析部
1はトークン生成部6とトークン変換部7に分けられ
る。トークン生成部6は、ソースプログラムから切り出
した文字列からトークンを生成する。トークン変換部7
は、外部から与えられた動作モード(この場合はコンパ
イルオプション)で指定された構文規則選択情報8(動
作モードと等価)と、予め作成され保持されているトー
クン変換テーブル9を基にトークン生成部6で生成され
たトークンを変換する。トークン変換テーブル9はトー
クンをどのように変換すべきかが指定されているテーブ
ルで、例えば図3のように、A欄,B欄,C欄で構成さ
れる。A欄には変換前のトークン、B欄には構文規則選
択情報、C欄には変換後のトークンが入っている。トー
クン変換部7は、トークン生成部6で生成されたトーク
ンをA欄、コンパイルオプションで指定された構文規則
選択情報8を参照してこれをB欄に当てはめたときのC
欄のトークンを出力する。1つのトークンが状況によっ
て異なるトークンに変換されるので、A欄の1つのトー
クンに対してB,C欄は複数存在する。構文解析部2は
C欄のトークンを含む構文規則に従って構文解析を行
う。
【0012】図2は実施例1のコンパイラのうち、字句
解析部1と構文解析部2の処理フローの例である。ソー
スプログラムが字句解析部1に入力されると文字列が切
り出される。トークン生成部6は切り出された文字列か
らトークンを生成する。トークン変換部7は、生成され
たトークンがトークン変換テーブル9のA欄に含まれて
いれば、現在の動作モードすなわちコンパイルオプショ
ンで指定された構文規則選択情報8を参照してB欄に当
てはめて、C欄に入っているトークンに変換する。実際
にはA欄の表引きを行わない効率的なインプリメントも
可能であるが、ここでは一例として3つの欄からなるト
ークン変換テーブルを用いている。このようにして、動
作モードであるコンパイルオプションによって異なるト
ークンが字句解析部1で生成され、そのトークンは構文
解析部2に渡される。構文解析部2には構文規則選択情
報が付加されたトークンを含む構文規則を予め用意して
おく。構文解析部2は、該用意された構文規則の中か
ら、字句解析部1から渡されたトークンが当てはまる構
文規則を選択し、この選択した構文規則に従って構文解
析を行う。
解析部1と構文解析部2の処理フローの例である。ソー
スプログラムが字句解析部1に入力されると文字列が切
り出される。トークン生成部6は切り出された文字列か
らトークンを生成する。トークン変換部7は、生成され
たトークンがトークン変換テーブル9のA欄に含まれて
いれば、現在の動作モードすなわちコンパイルオプショ
ンで指定された構文規則選択情報8を参照してB欄に当
てはめて、C欄に入っているトークンに変換する。実際
にはA欄の表引きを行わない効率的なインプリメントも
可能であるが、ここでは一例として3つの欄からなるト
ークン変換テーブルを用いている。このようにして、動
作モードであるコンパイルオプションによって異なるト
ークンが字句解析部1で生成され、そのトークンは構文
解析部2に渡される。構文解析部2には構文規則選択情
報が付加されたトークンを含む構文規則を予め用意して
おく。構文解析部2は、該用意された構文規則の中か
ら、字句解析部1から渡されたトークンが当てはまる構
文規則を選択し、この選択した構文規則に従って構文解
析を行う。
【0013】次に、本実施例のコンパイラ構成法で、以
下の文法1において構文規則(5)、(6)の一方だけを選
択的に適用するコンパイラの実現方法を示す。 文法1 S→xy …(5) S→xz …(6) ここで、Sは開始記号、x,y,zはトークンである。ト
ークン変換テーブル9の内容は図3のようになる。A欄
には構文規則(5),(6)に共通に含まれるトークンxを
入れる。B欄にはコンパイラオプションで指定されうる
構文規則選択情報としてそれぞれ「構文規則(5)を適
用」、「構文規則(6)を適用」を入れる。また、トーク
ンxに「構文規則(5)を適用」という情報を付加したも
のをトークンx1、「構文規則(6)を適用」という情報
を付加したものをトークンx2とし、それぞれC欄に入
れる。また、文法1の構文規則(5)、(6)に含まれるト
ークンxをx1,x2を用いて書き換えてそれぞれ構文規
則(7)、(8)とし、これを文法2とする。この文法2は
予め構文解析部2に用意しておく。構文解析部2はこの
文法2を用いて構文解析を行う。 文法2 S→x1y …(7) S→x2z …(8) 以上の構成による構文解析系の動作は次のようになる。
まず、トークン生成部6がトークンxを生成する。トー
クンxはトークン変換テーブル9のA欄に含まれている
ので、構文規則選択情報8を参照し、「構文規則(5)を
適用」であればトークンx1、「構文規則(6)を適用」
であればトークンx2にトークンxを変換し、構文解析
部2に渡す。構文解析部2は、トークンx1が渡される
と構文規則(7)だけを、トークンx2が渡されると構文
規則(8)だけを選択し、解析する。このように、字句解
析部が外部から与えられる動作モードであるコンパイラ
オプションに応じて異なるトークンを生成し、それを構
文解析部に渡すことで、構文解析部は構文規則を動的に
切り換えて適用するコンパイラを簡単に作成することが
できる。
下の文法1において構文規則(5)、(6)の一方だけを選
択的に適用するコンパイラの実現方法を示す。 文法1 S→xy …(5) S→xz …(6) ここで、Sは開始記号、x,y,zはトークンである。ト
ークン変換テーブル9の内容は図3のようになる。A欄
には構文規則(5),(6)に共通に含まれるトークンxを
入れる。B欄にはコンパイラオプションで指定されうる
構文規則選択情報としてそれぞれ「構文規則(5)を適
用」、「構文規則(6)を適用」を入れる。また、トーク
ンxに「構文規則(5)を適用」という情報を付加したも
のをトークンx1、「構文規則(6)を適用」という情報
を付加したものをトークンx2とし、それぞれC欄に入
れる。また、文法1の構文規則(5)、(6)に含まれるト
ークンxをx1,x2を用いて書き換えてそれぞれ構文規
則(7)、(8)とし、これを文法2とする。この文法2は
予め構文解析部2に用意しておく。構文解析部2はこの
文法2を用いて構文解析を行う。 文法2 S→x1y …(7) S→x2z …(8) 以上の構成による構文解析系の動作は次のようになる。
まず、トークン生成部6がトークンxを生成する。トー
クンxはトークン変換テーブル9のA欄に含まれている
ので、構文規則選択情報8を参照し、「構文規則(5)を
適用」であればトークンx1、「構文規則(6)を適用」
であればトークンx2にトークンxを変換し、構文解析
部2に渡す。構文解析部2は、トークンx1が渡される
と構文規則(7)だけを、トークンx2が渡されると構文
規則(8)だけを選択し、解析する。このように、字句解
析部が外部から与えられる動作モードであるコンパイラ
オプションに応じて異なるトークンを生成し、それを構
文解析部に渡すことで、構文解析部は構文規則を動的に
切り換えて適用するコンパイラを簡単に作成することが
できる。
【0014】次に、本発明の実施例2について説明す
る。実施例2では、以下の文法3の構文規則(9)を動作
モード(この場合はコンパイルオプション)によって有
効または無効にするコンパイラの実現方法を示す。文法
3には構文規則(9)以外にも構文規則が含まれている
が、ここでは省略している。 文法3 S→c1 …(9) ここで、Sは開始記号、c1はトークンである。トーク
ンc1は他の構文規則に含まれていないものとする。ト
ークン変換テーブル9の内容は図4のようになる。A欄
にはトークンc1を入れる。B欄には動作モード(コン
パイラオプション)で指定されうる構文規則選択情報
(動作モードと等価)としてそれぞれ「構文規則(9)は
有効」、「構文規則(9)は無効」を入れる。また、トー
クンc1に「構文規則(9)は有効」という構文規則情報
を付加したものをトークンc1、「構文規則(9)は無
効」という構文規則情報を付加したものをトークンbad-
tokenとし、それぞれC欄に入れる。トークンbad-token
はそのトークンがエラーであるということ示すために用
いられるトークンで、文法3の構文規則には含まれてい
ない。
る。実施例2では、以下の文法3の構文規則(9)を動作
モード(この場合はコンパイルオプション)によって有
効または無効にするコンパイラの実現方法を示す。文法
3には構文規則(9)以外にも構文規則が含まれている
が、ここでは省略している。 文法3 S→c1 …(9) ここで、Sは開始記号、c1はトークンである。トーク
ンc1は他の構文規則に含まれていないものとする。ト
ークン変換テーブル9の内容は図4のようになる。A欄
にはトークンc1を入れる。B欄には動作モード(コン
パイラオプション)で指定されうる構文規則選択情報
(動作モードと等価)としてそれぞれ「構文規則(9)は
有効」、「構文規則(9)は無効」を入れる。また、トー
クンc1に「構文規則(9)は有効」という構文規則情報
を付加したものをトークンc1、「構文規則(9)は無
効」という構文規則情報を付加したものをトークンbad-
tokenとし、それぞれC欄に入れる。トークンbad-token
はそのトークンがエラーであるということ示すために用
いられるトークンで、文法3の構文規則には含まれてい
ない。
【0015】以上の構成による構文解析系の動作は次の
ようになる。
ようになる。
【0016】トークン生成部6がトークンc1を生成し
たら、トークン変換部7はトークン変換テーブル9を参
照して、構文規則選択情報8を参照し、「構文規則(9)
は有効」であればトークンc1、「構文規則(9)は無
効」であればトークンbad-tokenにトークンc1を変換し
て、構文解析部2に渡す。構文解析部2には文法3の構
文規則(9)が用意されており、、トークンc1が渡され
ると構文規則(9)が適用される。トークンbad-tokenが
渡されると、構文解析部2には適用される構文規則がな
いので構文エラーになる。このように、字句解析部が外
部から与えられる動作モードであるコンパイラオプショ
ンに応じて異なるトークンを生成し、それを構文解析部
に渡すことで、構文規則を動的に有効、無効にするコン
パイラを簡単に作成することができる。
たら、トークン変換部7はトークン変換テーブル9を参
照して、構文規則選択情報8を参照し、「構文規則(9)
は有効」であればトークンc1、「構文規則(9)は無
効」であればトークンbad-tokenにトークンc1を変換し
て、構文解析部2に渡す。構文解析部2には文法3の構
文規則(9)が用意されており、、トークンc1が渡され
ると構文規則(9)が適用される。トークンbad-tokenが
渡されると、構文解析部2には適用される構文規則がな
いので構文エラーになる。このように、字句解析部が外
部から与えられる動作モードであるコンパイラオプショ
ンに応じて異なるトークンを生成し、それを構文解析部
に渡すことで、構文規則を動的に有効、無効にするコン
パイラを簡単に作成することができる。
【0017】次に、本発明の実施例3について図面を用
いて説明する。実施例1におけるトークン生成部6の内
部では、(1)ソース上の文字列を切り出し、(2)文字列
を文字列ID(字句解析部で認識すべき文字列に固有の
ID)に変換し、(3)文字列IDに対応するトークンを
生成する、という動作を行っている。文字列から文字列
IDを算出するための「文字列ID算出関数」、文字列
IDとトークンとの対応を記した「文字列ID−トーク
ン対応テーブル」はあらかじめ用意されている。
いて説明する。実施例1におけるトークン生成部6の内
部では、(1)ソース上の文字列を切り出し、(2)文字列
を文字列ID(字句解析部で認識すべき文字列に固有の
ID)に変換し、(3)文字列IDに対応するトークンを
生成する、という動作を行っている。文字列から文字列
IDを算出するための「文字列ID算出関数」、文字列
IDとトークンとの対応を記した「文字列ID−トーク
ン対応テーブル」はあらかじめ用意されている。
【0018】図5は本実施例によるプログラミング言語
コンパイラの構成例である。このコンパイラは、初期化
部10、字句解析部11、構文解析部12、意味解析部
13、最適化部14、オブジェクトコード出力部15で
構成されている。このうち初期化部10は文字列ID−
トークン対応テーブル生成部16で構成されている。ま
た、字句解析部11はトークン生成部17で構成されて
いる。
コンパイラの構成例である。このコンパイラは、初期化
部10、字句解析部11、構文解析部12、意味解析部
13、最適化部14、オブジェクトコード出力部15で
構成されている。このうち初期化部10は文字列ID−
トークン対応テーブル生成部16で構成されている。ま
た、字句解析部11はトークン生成部17で構成されて
いる。
【0019】図6は本実施例によるプログラミング言語
コンパイラのうち、初期化部10、字句解析部11、構
文解析部12の処理フローの例である。コンパイラが起
動されると、文字列ID−トークン対応テーブル生成部
16によって文字列ID−トークン対応テーブル18が
作成される。文字列ID−トークン対応テーブル18に
はコンパイルオプションに応じて構文規則選択情報が付
加されたトークンを入れておく。例えば図7のように、
コンパイルオプションで「構文規則(5)を適用」が指定
されたときは文字列ID=1のエントリにトークンx1
を入れ、「構文規則(6)を適用」が指定されたときは文
字列ID=1のエントリにトークンx2を入れておく。
トークン生成部17では、起動時に生成された文字列I
D−トークン対応テーブル18を参照してトークンを生
成する。このトークンにはすでに構文規則選択情報が付
加されているので、そのまま構文解析部12に渡され
る。構文解析部12には、たとえば実施例1の文法2と
同様な構文規則からなる文法が用意されており、字句解
析部から構文規則選択情報が付加されたトークンが与え
られたとき、該トークンを含む構文規則に従って構文解
析を行う。
コンパイラのうち、初期化部10、字句解析部11、構
文解析部12の処理フローの例である。コンパイラが起
動されると、文字列ID−トークン対応テーブル生成部
16によって文字列ID−トークン対応テーブル18が
作成される。文字列ID−トークン対応テーブル18に
はコンパイルオプションに応じて構文規則選択情報が付
加されたトークンを入れておく。例えば図7のように、
コンパイルオプションで「構文規則(5)を適用」が指定
されたときは文字列ID=1のエントリにトークンx1
を入れ、「構文規則(6)を適用」が指定されたときは文
字列ID=1のエントリにトークンx2を入れておく。
トークン生成部17では、起動時に生成された文字列I
D−トークン対応テーブル18を参照してトークンを生
成する。このトークンにはすでに構文規則選択情報が付
加されているので、そのまま構文解析部12に渡され
る。構文解析部12には、たとえば実施例1の文法2と
同様な構文規則からなる文法が用意されており、字句解
析部から構文規則選択情報が付加されたトークンが与え
られたとき、該トークンを含む構文規則に従って構文解
析を行う。
【0020】本実施例のコンパイラの場合、実施例1の
コンパイラのようにトークン作成後にトークンを変換す
る必要はない。すなわち、実施例1のコンパイラで必要
としていたトークン変換部7が不要になる。本実施例の
コンパイラを実施例1のコンパイラと比較すると、起動
時の文字列ID−トークン対応テーブル生成のオーバー
ヘッドが生じるという欠点がある。
コンパイラのようにトークン作成後にトークンを変換す
る必要はない。すなわち、実施例1のコンパイラで必要
としていたトークン変換部7が不要になる。本実施例の
コンパイラを実施例1のコンパイラと比較すると、起動
時の文字列ID−トークン対応テーブル生成のオーバー
ヘッドが生じるという欠点がある。
【0021】しかし、実施例1では1トークン生成する
ごとに生じていたトークン変換のオーバーヘッドが消え
るので、大きなプログラムを解析する場合のコンパイル
効率が向上するという利点がある。
ごとに生じていたトークン変換のオーバーヘッドが消え
るので、大きなプログラムを解析する場合のコンパイル
効率が向上するという利点がある。
【0022】
【発明の効果】以上説明したように、本発明によれば、
コンパイラ外部から与えられた動作モードに応じて、字
句解析と構文解析の範囲だけで、構文規則を動的に切り
換える構文解析系を有するコンパイラを得ることができ
る。
コンパイラ外部から与えられた動作モードに応じて、字
句解析と構文解析の範囲だけで、構文規則を動的に切り
換える構文解析系を有するコンパイラを得ることができ
る。
【図1】実施例1のコンパイラの構成を示す図である。
【図2】実施例1のコンパイラにおける処理のうち、字
句解析部と構文解析部の処理フローの例を示す図であ
る。
句解析部と構文解析部の処理フローの例を示す図であ
る。
【図3】実施例1におけるトークン変換テーブルの例を
示す図である。
示す図である。
【図4】実施例2におけるトークン変換テーブルの例を
示す図である。
示す図である。
【図5】実施例3のコンパイラの構成を示す図である。
【図6】実施例3のコンパイラの処理のうち、初期化
部、字句解析部、構文解析部の処理フローの例を示す図
である。
部、字句解析部、構文解析部の処理フローの例を示す図
である。
【図7】実施例3における文字列ID−トークン対応テ
ーブルの例を示す図である。
ーブルの例を示す図である。
1 字句解析部
2 構文解析部
3 意味解析部
4 最適化部
5 オブジェクトコード出力部
6 トークン生成部
7 トークン変換部
8 コンパイルオプションで指定される構文規則選択情
報 9 トークン変換テーブル 10 初期化部 11 字句解析部 12 構文解析部 13 意味解析部 14 最適化部 15 オブジェクトコード出力部 16 文字列ID−トークン対応テーブル生成部 17 トークン生成部 18 文字列ID−トークン対応テーブル
報 9 トークン変換テーブル 10 初期化部 11 字句解析部 12 構文解析部 13 意味解析部 14 最適化部 15 オブジェクトコード出力部 16 文字列ID−トークン対応テーブル生成部 17 トークン生成部 18 文字列ID−トークン対応テーブル
─────────────────────────────────────────────────────
フロントページの続き
(72)発明者 中嶋 啓人
神奈川県横浜市戸塚区戸塚町5030番地
株式会社 日立製作所 ソフトウェア開
発本部内
(72)発明者 赤藤 勝也
神奈川県横浜市戸塚区戸塚町5030番地
株式会社 日立製作所 ソフトウェア開
発本部内
(72)発明者 坂西 宣一郎
神奈川県横浜市戸塚区戸塚町5030番地
株式会社 日立製作所 ソフトウェア開
発本部内
(72)発明者 沼野井 淳
神奈川県横浜市戸塚区戸塚町5030番地
株式会社 日立製作所 ソフトウェア開
発本部内
(56)参考文献 特開 平2−44427(JP,A)
特開 平1−316873(JP,A)
特開 昭50−159940(JP,A)
特開 昭60−181838(JP,A)
特開 平3−71342(JP,A)
特開 平1−184540(JP,A)
特開 平4−98322(JP,A)
インターフェース,日本,CQ出版株
式会社,1992年11月 1日,Vol.
18,No.11,pp.119−128
中西正和、大野義夫,「やさしいコン
パイラの作り方」,日本,共立出版株式
会社,1980年,初版,pp.58−63
(58)調査した分野(Int.Cl.7,DB名)
G06F 9/45
G06F 9/06
JSTファイル(JOIS)
CSDB(日本国特許庁)
Claims (4)
- 【請求項1】 字句解析部と構文解析部を含むプログラ
ミング言語コンパイラにおけるコンパイル方法であっ
て、 あるプログラミング言語の文法Xに含まれる構文規則
が、動作モードによって該動作モードに対応する構文規
則になる場合、前記字句解析部は、変換前のトークンと
動作モードと変換後のトークンからなるトークン変換テ
ーブルを備え、特定の文字列から生成したトークンを前
記トークン変換テーブルにより動作モードに対応する異
なるトークンに変換し、動作モードに対応するトークン
を含む構文規則を有する前記構文解析部に渡し、該構文
解析部は、字句解析部からトークンを受理したとき、該
トークンを含む構文規則だけを選択的に適用可能にする
ことを特徴とするコンパイル方法。 - 【請求項2】 字句解析部と構文解析部を含むプログラ
ミング言語コンパイラにおけるコンパイル方法であっ
て、 あるプログラミング言語の文法Xに含まれる構文規則が
動作モードによって有効または無効になる場合、前記字
句解析部は、変換前のトークンと動作モードと変換後の
トークンからなるトークン変換テーブルを備え、特定の
文字列から生成したトークンを前記トークン変換テーブ
ルにより動作モードに対応する異なるトークンに変換
し、動作モードに対応するトークンを含む構文規則を有
する前記構文解析部に渡し、該構文解析部は、字句解析
部からトークンを受理したとき、該トークンを含む構文
規則だけを有効とし、該トークンを含む構文規則がない
場合は構文規則を無効とすることを特徴とするコンパイ
ル方法。 - 【請求項3】 初期化部と字句解析部と構文解析部を含
むプログラミング言語コンパイラにおけるコンパイル方
法であって、 あるプログラミング言語の文法Xに含まれる構文規則
が、動作モードによって該動作モードに対応する構文規
則になる場合、前記初期化部は動作モードに対応する文
字列ID−トークン変換テーブルを生成し、前記字句解
析部は、特定の文字列から前記文字列ID−トークン対
応テーブルに従って動作モードに対応する異なるトーク
ンを生成し、動作モードに対応するトークンを含む構文
規則を有する前記構文解析部に渡し、該構文解析部は、
字句解析部からトークンを受理したとき、該トークンを
含む構文規則だけを選択的に適用可能にすることを特徴
とするコンパイル方法。 - 【請求項4】 初期化部と字句解析部と構文解析部を含
むプログラミング言語コンパイラにおけるコンパイル方
法であって、 あるプログラミング言語の文法Xに含まれる構文規則が
動作モードによって有効または無効になる場合、前記初
期化部は動作モードに対応する文字列ID−トークン変
換テーブルを生成し、前記字句解析部は、特定の文字列
から前記文字列ID−トークン対応テーブルに従って動
作モードに対応する異なるトークンを生成し、動作モー
ドに対応するトークンを含む構文規則を有する前記構文
解析部に渡し、該構文解析部は、字句解析部からトーク
ンを受理したとき、該トークンを含む構文規則だけを有
効とし、該トークンを含む構文規則がない場合は構文規
則を無効とすることを特徴とするコンパイル方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP29457696A JP3370243B2 (ja) | 1996-10-16 | 1996-10-16 | コンパイル方法及び装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP29457696A JP3370243B2 (ja) | 1996-10-16 | 1996-10-16 | コンパイル方法及び装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH10124326A JPH10124326A (ja) | 1998-05-15 |
JP3370243B2 true JP3370243B2 (ja) | 2003-01-27 |
Family
ID=17809573
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP29457696A Expired - Fee Related JP3370243B2 (ja) | 1996-10-16 | 1996-10-16 | コンパイル方法及び装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3370243B2 (ja) |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS57533B2 (ja) * | 1974-06-14 | 1982-01-07 | ||
JPS60181838A (ja) * | 1984-02-28 | 1985-09-17 | Fujitsu Ltd | コンパイラ |
JPH01184540A (ja) * | 1988-01-19 | 1989-07-24 | Fujitsu Ltd | 構文解析方式 |
JPH01316873A (ja) * | 1988-06-16 | 1989-12-21 | Nec Corp | 翻訳システムの予約語テーブル管理方式 |
JPH0244427A (ja) * | 1988-08-05 | 1990-02-14 | Nippon Telegr & Teleph Corp <Ntt> | プログラム翻訳変換方式 |
JPH0371342A (ja) * | 1989-08-11 | 1991-03-27 | Nec Corp | 予約語判定方式 |
JPH0498322A (ja) * | 1990-08-10 | 1992-03-31 | Fujitsu Ltd | コンパイラの作成方法 |
-
1996
- 1996-10-16 JP JP29457696A patent/JP3370243B2/ja not_active Expired - Fee Related
Non-Patent Citations (2)
Title |
---|
インターフェース,日本,CQ出版株式会社,1992年11月 1日,Vol.18,No.11,pp.119−128 |
中西正和、大野義夫,「やさしいコンパイラの作り方」,日本,共立出版株式会社,1980年,初版,pp.58−63 |
Also Published As
Publication number | Publication date |
---|---|
JPH10124326A (ja) | 1998-05-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP0993640B1 (en) | Command parsing and rewrite system and method | |
US7823139B2 (en) | Method and system for translating programming languages | |
JPH07105012A (ja) | 言語処理プログラムのコンパイル処理方式 | |
Watson | A practical approach to compiler construction | |
Bochmann et al. | Compiler writing system for attribute grammars | |
RU2115158C1 (ru) | Способ и устройство для достоверной оценки семантических признаков в синтаксическом анализе при проходе вперед слева направо | |
JP2879099B1 (ja) | 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置 | |
Koskimies et al. | The design of a language processor generator | |
JP3370243B2 (ja) | コンパイル方法及び装置 | |
Paakki | Prolog in practical compiler writing | |
Bahlke et al. | Design and structure of a semantics-based programming environment | |
Koskimies | Lazy recursive descent parsing for modular language implementation | |
JPH07182179A (ja) | オブジェクト指向データベース管理装置 | |
Meijer | The project on extended affix grammars at Nijmegen | |
JP3003459B2 (ja) | プログラム作成支援装置 | |
Joisha et al. | The Design and Implementation of a Parser and Scanner for the MATLAB Language in the MATCH Compiler | |
Bottos et al. | Generation of syntax-directed editors with text-oriented features | |
Amal et al. | Software tool for translating pseudocode to a programming language | |
CN118069149A (zh) | 一种用于ros机器人任务规划的图形化pddl编译方法及系统 | |
JPH07121379A (ja) | 複数言語混在コンパイラ | |
JPH08286927A (ja) | アセンブラ処理方式 | |
Helzerman et al. | Parallel parsing of spoken language | |
JP3141945B2 (ja) | コンパイル装置 | |
Mackie | Undergraduate Topics in Computer Science | |
Miles et al. | Implementing generalized operator overloading |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20071115 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20081115 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20081115 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20091115 Year of fee payment: 7 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20101115 Year of fee payment: 8 |
|
LAPS | Cancellation because of no payment of annual fees |