JPH07141201A - 2パスコンパイラのための改良された方法 - Google Patents
2パスコンパイラのための改良された方法Info
- Publication number
- JPH07141201A JPH07141201A JP6109864A JP10986494A JPH07141201A JP H07141201 A JPH07141201 A JP H07141201A JP 6109864 A JP6109864 A JP 6109864A JP 10986494 A JP10986494 A JP 10986494A JP H07141201 A JPH07141201 A JP H07141201A
- Authority
- JP
- Japan
- Prior art keywords
- pass
- block
- parser
- file
- function
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims description 91
- 238000012545 processing Methods 0.000 claims abstract description 37
- 230000006870 function Effects 0.000 claims description 167
- 238000004519 manufacturing process Methods 0.000 claims description 58
- 238000013500 data storage Methods 0.000 claims description 11
- 238000004891 communication Methods 0.000 abstract description 3
- 230000008569 process Effects 0.000 description 46
- 238000012546 transfer Methods 0.000 description 45
- 239000000872 buffer Substances 0.000 description 35
- 230000009471 action Effects 0.000 description 11
- 238000010586 diagram Methods 0.000 description 10
- 230000008859 change Effects 0.000 description 5
- 230000007246 mechanism Effects 0.000 description 5
- 238000002360 preparation method Methods 0.000 description 5
- 239000012925 reference material Substances 0.000 description 4
- 210000001072 colon Anatomy 0.000 description 3
- 230000006399 behavior Effects 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- ORQBXQOJMQIAOY-UHFFFAOYSA-N nobelium Chemical compound [No] ORQBXQOJMQIAOY-UHFFFAOYSA-N 0.000 description 2
- 230000009467 reduction Effects 0.000 description 2
- 230000007704 transition Effects 0.000 description 2
- 239000000470 constituent Substances 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000012464 large buffer Substances 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 238000012805 post-processing Methods 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
- 239000011800 void material Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
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)
Abstract
パス言語コンパイラを提供すること 【構成】 コンピュータプログラミング言語の入力ソー
スコードを第1のパスに際してスキャン及び構文解析
し、再生すべきパーサ状態を第2のパスに際してセーブ
するシステムである。従ってソースファイルは再スキャ
ンされることはなく、また第2のパスに際して再度構文
解析されることもない。パーサ状態は、第2のパスに際
して再生され、文法中の全ての構文解析動作は、第2の
パスにおいて、それらが第1のパスにおける実際の構文
解析において当初記録されたのと同じ順序で再度実行さ
れる。このことは元の入力言語を再度スキャンして再度
構文解析する必要性を排除し、コンパイラの処理時間を
短縮させる。ユーザは各々のパスに際してどのコードを
実行するかを指定し、システムはまたパス間の通信のた
めの便宜をも提供する。
Description
に関し、特に、コンピュータシステム内の言語コンパイ
ラに関し、とりわけ、高効率の2パス言語コンパイラの
生成方法に関する。
実行されて或る言語を別の言語に変換するプログラムで
ある。一般に、変換対象となるソース言語と呼ばれる言
語は、プログラミング技術における当業者であるコンピ
ュータプログラマが容易に読み取り理解することができ
る言語である。ソース言語は一般に、オブジェクト言語
へと翻訳される。このオブジェクト言語は、そのコンパ
イラ自体が実行されるコンピュータのためのマシン語で
ある場合が多い、オブジェクト言語またはマシン語は、
一般にコンピュータ自体にしか理解できないものであ
る。
ートメントを読み出し、そのステートメントを1つ以上
のオブジェクト言語ステートメントへと翻訳する。言語
によっては、「前方参照(forward reference)」が可能
であり、その場合には、ソースファイル中の或る位置に
おける言語ステートメントが、そのソースファイル中の
後続ポイントで発生する情報を参照することになる。ソ
ースファイル中の後続ポイントで情報が発生する場合、
コンパイラは、ソース言語のステートメントを1回読み
出しただけではその翻訳を完成することができない。こ
れは、前方参照がどこに位置しているかコンパイラが知
らないからである。従って、前方参照が可能な場合に
は、コンパイラは、マシンコードまたは後で最適化され
る中間コード等のオブジェクト言語へとソースコードを
完全にコンパイルするために、ソースコードに対して2
回以上のパスを実行しなければならない。
と呼ばれる2つの主要セクションを用いて構成されるこ
とが多い。字句スキャナは、単にスキャナと呼ばれるこ
とが多く、ソースステートメントを読み出して、そのソ
ースステートメントからの各ワード記号または数を「ト
ークン」へと分割する。その各トークンには参照記号
(数である場合が多い)が付与され、この参照記号がコ
ンパイラのパーサセクションに送られる。コンパイラの
パーサセクションは、多数のトークンに処理を行って、
それらトークンをその言語で有効なステートメントへと
分割する。即ち、スキャナがソースコードをトークンの
ストリームへと分割し、パーサが、その多数のトークン
を解析して、そのトークンがその言語内のステートメン
トと一致するか否かを判定する。パーサが、1つ以上の
トークンと言語内における有効なステートメントとの間
に一致を見つけると、パーサ動作ルーチンが呼び出され
て、その言語のステートメントに対応するオブジェクト
言語コードが出力されることになる。
態をとることが可能なものである。その一形態は、第1
パス中にソース言語のスキャンおよび構文解析を行っ
て、そのソース言語中の変数に関する必要とされるタイ
プ情報を求め、次いでそのタイプ情報を用いて第2パス
中に再びソース言語の再スキャンおよび再構文解析を行
って、オブジェクト言語コードを実際に生成する。従っ
て、第1パスによって全情報の位置が決定され、これに
より、第2パス中には全ての前方参照が既知のものとな
って、正確なオブジェクト言語コードを生成することが
可能になる。この技法を利用して既存の1パスコンパイ
ラをマルチパスコンパイラに変更することは比較的容易
ではあるが、この方法は、ソースコードのスキャンおよ
び構文解析を2回行うことを必要とし、このため、ソー
ス言語コードをオブジェクト言語コードにコンパイルす
るのに必要な時間が大幅に増加することになる。また、
別の方法では、ソースコードのスキャンおよび構文解析
を1回実行して、パーズツリーだけしか用いない第2パ
スに備えて必要なタイプ情報およびパーズツリーをセー
ブする。この技法もまた、良好に機能するものではある
が、一般にコンパイラ全体の基本設計に影響を与えるこ
とになり、例えば、第2パスのために構文解析規則を別
個に規定する必要が生じ、このため、既存のコンパイラ
を1パスから2パスに改良する場合には困難なプロセス
を伴うことになる。
クト言語コードにうまく変換するために必要なのは2パ
スだけである。
構文解析を行うことのない効率的な2パスコンパイラ
が、当業界で必要とされている。更に、旧式の1パスコ
ンパイラを2パスコンパイラに改良する能力を備えたコ
ンパイラライタにとって理解し易いコンパイラが、当業
界で必要とされている。更に、両方のパスに関するコー
ドを共にコンパイラのソースコード中に保持する2パス
コンパイラが、当業界で必要とされている。
ピュータシステム用の2パス言語コンパイラを作成する
方法を提供することにある。
か処理されないコンパイラを作成することにある。
収容した中間ファイルを利用することにある。
いての構文解析命令を単一位置で提供することを可能に
することにある。
的は、入力ソースコードのスキャンおよび構文解析を第
1パス中に行い、再生すべきパーサ状態を第2パス中に
セーブするシステムで達成される。従って、第2パス中
には、ソースファイルの再スキャンも再構文解析も行わ
れない。パーサ状態が第2パス中に再生され、その第2
パス中に文法中の全てのパーサ動作が、第1パスにおけ
る実際の構文解析中に当初に記録されたのと同じ順序で
実質的に再実行される。これにより、元の入力言語の再
スキャンおよび再構文解析を行う必要がなくなり、コン
パイラの処理時間が短縮される。
にどのコードを実行すべきかを文法で指定する。このシ
ステムは、文法内および文法外の両方で、2つのパスの
間の効率的な通信のための便宜を提供する。更に、文法
外のコンパイラソースコードのために、手順の呼び出し
を据え置き、変数値をセーブして自動的に復元し、コン
パイラのエラーメッセージを容易に取り扱うための便宜
も提供するものである。これらにより、既存の1パスコ
ンパイラの迅速で容易な改変が可能となる。
利点は、図面に関連して進める以下の詳細な説明を参照
することにより、一層良好に理解されよう。
実施態様に関するものである。本説明は、制限的な意味
に解釈されるべきものではなく、単に本発明の一般的原
理を説明することを目的としたものである。本発明の範
囲は、特許請求の範囲により判断されるべきである。
ムlex,yaccを利用するものであり、それらは、全てのUN
IX(UNIXはAT&Tの登録商標)オペレーティングシステム
上で利用可能なものである。lexスキャナおよびyaccパ
ーサジェネレータは、1970年代にベル電話研究所で開発
されたものである。スキャナユーティリティlexについ
ては、Alfred V. Aho、Ravi SethiおよびJeffery D. Ul
lmanによる「Compilers Principles, Techniques, and
Tools」(Addison Wesley, p.105〜, 1986)に解説されて
いる。yaccパーサジェネレータについては、上記と同じ
参考文献の257ページ以降で解説されている。更に、lex
およびyaccの双方については、Tony MasonおよびDoug B
rownによる「Lex & Yacc」(O'Reilly & Associates, In
c. ,1990)と題する文献に解説されている。
に入力される言語文法は、別の2パス指示語を有する標
準的なyacc文法である。この文法での各パーサ動作の実
行は、後述する文法中の規定により制限されない限り、
正確に2回実行される。2つの各パスにおいてパーサ動
作を実行させる制御、およびその2つのパス間での通信
は、後述の指示語によって容易化される。
するプログラマは、2つのパスのそれぞれについて各パ
ーサ動作においてどのコードを実行すべきかを指定す
る。この指定は、パススコープを用いて行われる。それ
らの特殊なパススコープは、文法内で通常のスコープを
使用することができる部分であればどこでも使用するこ
とができ、更に、そのスコープ内に含まれるコードを実
行すべきパスがどれであるかを指定する。例えば、下記
の2パスパーサ動作について考える。
出される。第2パス中には、このパーサ動作は何もしな
い。利用可能なパススコープは下記の通りである。
の場合、printfの呼び出しが各パスで1回だけ実行され
る。
行するのが望ましい場合が極めて多い。また、字句スキ
ャナは、第1パス中にソースコードのスキャンしか行わ
ないので、第2パス中には、そのスキャナにより生成さ
れるトークンと、恐らくは字句スキャナの何らかの状態
とが必要とされる可能性がある。
動作における第1パスコードの後に値をセーブし、次い
で、それと同じパーサ動作における第2パスコードの実
行中にそのセーブ値を復元する手段を提供する。コンパ
イラが第1パスを実行する際に、関数TWOPASS_SAVEによ
り識別された変数が、そのTWOPASS_SAVEの呼び出しが発
生したポイントでセーブされ、コンパイラが第2パスを
実行する際に、その変数がやはりTWOPASS_SAVEの呼び出
しが発生したポイントで復元され、これにより、その変
数が第2パス中で利用可能となるようになっている。
が第1パス中にキャラクタのポインタを返し、何らかの
理由で追加操作を第2パスまで据え置く必要があるもの
と仮定する。
呼び出しから返された数値を得る。次いで、それらの変
数の値が関数TWOPASS_SAVEの呼び出しによってセーブさ
れてパーサ動作が完了する。第2パス中に、aおよびbの
値がTWOPASS_SAVEの呼び出し位置で復元され、それらの
値が合計されて、第2パススコープに含まれるコード中
の変数$$が生成される。これらの値は、第1パス中でそ
れらの値が発生した位置と同じトークンストリーム中の
位置で第2パス中に復元される。例えば、上記のパーサ
動作は、第1パス中に多数回にわたって実行することが
可能であり、それに対応する第2パス中での各実行によ
り、前記第1パス中でのコードの実行が発生する毎に、
その位置に格納されている値が復元される。
されなければならないので、パススコープ12{}中に含ま
れなければならない。これは、上記の例の場合にはTWOP
ASS_SAVEが、*{ で始まるスコープ中にあるので、満た
されている。
加的な能力が提供される。変数「yypass」は、現在のパ
ス番号(1または2)を含む整数型の変数である。yypa
rse()がまだ呼び出されていないかまたは終了している
場合には、変数yypassの値はゼロとなる。
を規定する能力を有しているが、第2パス中でのトーク
ンストリームの再生において、そのトークンが第1パス
中でパーサにより当初に処理された場合と同じ位置ま
で、関数の実際の呼び出しを据え置く。この関数は、tw
opass_callfunc()と呼ばれ、第1パス中のtwopass_call
func()の位置と同じ入力トークンストリーム中のポイン
トで、第2パス中に或る関数が呼び出されるようにす
る。これは、文法を直接関連させることなく作業を据え
置くのに極めて有用な関数である。
ーザエラーメッセージを生成するコンパイラについて考
察する。そのエラーメッセージは、入力言語に基づいて
順に現れるのが望ましい(即ち、行nに関する全てのエ
ラーは、行n+1に関するエラーの前にプリントされ
る)。以下の関数は、この場合を取り扱ったものであ
る。
lfunc()を呼び出してそれと同じ位置で第2パス中でエ
ラー関数が呼び出されて、fprintステートメントがソー
ス中の同じポイントで第2パス中にのみ実際に実行され
るようになる。error()が第2パス中で呼び出される場
合には、その関数は単にfprintfを呼び出すことにな
る。
は、呼び出すべき関数の名称(Cプログラミング言語の
場合には、関数名の代わりに、その関数に対するポイン
タが用いられる)と、その関数が実際に呼び出された際
にその関数に渡される引数とが含まれる。
り、変数内容を、第1パス中で入力トークンストリーム
中の位置に有していた値と同じ値へと第2パス中で復元
することが可能である。これは、twopass_restoreと呼
ばれる関数を用いて行われる。twopass_restoreは、第
1パス中で呼び出された際に変数の内容をセーブする。
その変数内容は、第2パス中での入力トークンストリー
ムの再生時と同じ位置で第2パス中に復元される(以下
の図18に関する説明を参照のこと)。twopass_restor
eは、2つのパラメータを受容する。その第1パラメー
タは変数のポインタであり、第2パラメータは変数のバ
イトで表したサイズである。twopass_restoreは局所変
数に利用することはできない。これは、局所変数のアド
レスがパス毎に変化することがあるからである。
む変数のように、変数によっては、パス1とパス2との
両方について常に同じ値を有していることが必要な場合
がある。コンパイラは、最新の状態に保つ必要のあるこ
れら変数を取り扱うための機構を提供する。この機構
は、「TWOPASS_VAR」と呼ばれ、twopass_restoreより一
層効率の良いものである。これは、TWOPASS_VARが、自
動的にデータをセーブして復元するからであり、これに
対し、関数twopass_restoreは、自動的に復元するだけ
であり、ユーザは依然としてセーブのための関数を呼び
出す必要がある。機構TWOPASS_VARは、以下のように、
Cプログラミング言語によるプリプロセッサのステート
メント「#define」により実施される。
は、2つのパス間でlinenoを維持する。即ち、それがパ
ス1で変化すると、パス1で変化した各位置においてパ
ス2でも変化することになる。この機構は、好適実施例
の場合には、3つの変数に限定され、それらは文法のヘ
ッダ部でのみ定義することができる。
とを示すEOFトークンおよびソースコードがスキャナに
より返された際に、第1パスが終了して、第2パスが開
始される。しかし、任意のポイントで、コンパイラに対
し、パス1の処理を強制的に中止させて、直ちにパス2
の処理を開始させることが可能である。指示語「TWOPAS
S_DOPASS2」は、第1パスの終了および第2パスの開始
を直ちに発生させる。第2パスが完了すると、スキャナ
からの新しいトークンを用いて第1パスが再開する。即
ち、第1パスが単に中断される一方、第2パスが入力ト
ークンストリーム中のその同じポイントまで処理され
る。これにより、使用されるダイナミックメモリおよび
中間ファイルサイズの縮小が可能となる。恐らくは、第
2パスの完了後に、手順記号テーブル等の、指示語まで
の情報を排除することができるので、メモリの使用量が
減少し、また第1パスでの中間ファイルの再開始以降は
中間ファイルが小さくなる。
能である場合には、コンパイラは、一般にそのポイント
で動作を停止する。しかし、上述の据え置かれた関数の
呼び出しのためにエラーメッセージがプリントされなか
った可能性があるので、コンパイラは、その実行を停止
する前に全てのエラーメッセージをプリントする機構を
提供する。この関数は、twopass_error_callfunc()と呼
ばれる。この関数は、その呼び出し時に、待ち行列に入
っている全てのtwopass_callfunc()をさかのぼって、エ
ラーに関連するものを呼び出し、エラーメッセージがプ
リント出力されることになる。この関数の呼び出しの
後、コンパイラは、その回復不可能なエラーに起因して
実行を停止することができる。
び出される2つの関数を提供して、各パスの開始時に行
う必要のある初期設定を可能にするものである。
システムを示すブロック図である。同図のコンピュータ
システム100は処理要素102を備えている。この処理素子
102は、システムバス104を介してコンピュータシステム
100の他の要素との通信を行うものである。キーボード1
06は、このコンピュータシステムのユーザによるこのシ
ステムへのテキスト入力を可能にし、またマウス110
は、このコンピュータシステムへのグラフィックデータ
入力を可能にする。グラフィックディスプレイ108は、
このシステムのユーザに対してテキスト情報およびグラ
フィック情報の表示を行うことを可能にする。ディスク
112は、本発明のソフトウェアおよびデータファイルを
格納するものである。
18を備えたものであり、このオペレーティングシステム
118により、本発明のソフトウェアがこのシステムの様
々な入出力装置との通信を行うことが可能になる。プリ
/ポストプロセッサ120およびパーサジェネレータ122が
使用されて、ディスク112から言語の文法情報が読み出
され、オブジェクト言語の言語コマンドに処理を加えて
このコンピュータシステムのユーザのためのコードを生
成する2パスコンパイラ126が生成される。
するためのプロセスを示すブロック図である。同図にお
いて、ディスク112(図1参照)のファイルに含まれて
いる言語文法情報204はプリプロセッサ120に入力され
る。プリプロセッサ120は、その言語文法を、yaccパー
サジェネレータにとって受容可能な形態になるように変
更する。次いでその情報がファイル206としてyaccパー
サジェネレータ122に送られる。yaccパーサジェネレー
タ122の出力が、ファイル208であり、ポストプロセッサ
ソフトウェア124に送られる。ポストプロセッサソフト
ウェア124は、2パスパーサドライバファイル210を読み
出し、そのファイルとyaccパーサジェネレータ122の出
力208とを組み合わせて、2パスコンパイラのソースコ
ード212を生成する。このソースコードが言語コンパイ
ラ214に入力され、その言語コンパイラ214が、そのソー
スコードをコンピュータシステム100内で実行可能なオ
ブジェクトコードへと変換する。次いでそのオブジェク
トコードが2パスコンパイラ126としてディスク112に格
納される。
を示すブロック図である。同図において、ディスク112
上にあるソースコードファイル302からのデータは、字
句スキャナ304に入力される。字句スキャナ304は、第1
パスパーサ306により呼び出され、これをライン314で示
すこととする。字句スキャナは、ソースファイル302か
らの各ワードや数等を分離して、その各々を、ライン31
6を介した第1パスパーサ306への「トークン」として識
別する。更に、そのトークンが、定義可能な値を有する
数またはキャラクタストリング等である場合、その値
は、yytextと呼ばれる変数で、ライン318を介して第1
パスパーサ306へ送られる。第1パスパーサ306は、字句
スキャナ304からのトークンを読み、そのソースコード
ファイル302から受け取ったトークンに対して言語の文
法の突き合わせを行う。その第1パスパーサ306の各状
態は、第2パスパーサ308による使用に備えてディスク1
12の中間ファイル312に格納される。第1パスパーサ306
および第2パスパーサ308は両方とも、パーサ動作関数3
10を呼び出す。このパーサ動作関数310は、2パスコン
パイラ126の生成時に言語文法204(図2参照)内で定義
されるものである。第2パスパーサ308の出力324は、コ
ンピュータシステム100内での実行に適したコンパイル
されたコードである。
0およびポストプロセッサブロック124を示すブロック図
である。図2に別個に示すように、プリプロセッサ120
およびポストプロセッサ124は、好適実施例では単一の
モジュールとして実施される。この単一モジュールは、
言語文法204の前処理を行って中間ファイル410を生成す
る。次いでプリ/ポストプロセッサ406は、子プロセス
を生成してその子プロセス中でyaccパーサジェネレータ
408を実行することによりyaccパーサジェネレータ408を
呼び出し、そのyaccパーサジェネレータ408に入力とし
て中間ファイル410を送る。yaccパーサジェネレータ408
は、その中間ファイル410の処理を行って、パーサ出力
ファイル412を生成する。yaccパーサジェネレータ408が
その処理を完了すると、プリ/ポストプロセッサパーサ
406に戻り、そのプリ/ポストプロセッサパーサ406が、
パーサ出力ファイル412を読み出してその処理を行って
コンパイラ出力ソースファイル212を生成し、次いでそ
れをコンパイラ214(図2参照)に送る。
ロセッサパーサ406を示すフローチャートである。図5
のブロック502でプリ/ポストプロセッサパーサに入
る。ブロック502に入ると、同ブロックで、入力コマン
ド行で送られた最初のまたは次のパラメータを得る。ブ
ロック504では、そのパラメータがシーケンス「-tp:」
で始まるか否かを判定し、シーケンス「-tp:」で始まる
場合には、ブロック506に移行して、2パスコンパイラ
のためにそのパラメータの処理を行う。また、そのパラ
メータがシーケンス「-tp:」で始まらない場合には、ブ
ロック504からブロック508に移行して、yaccに送るべき
パラメータをセーブする。パラメータの処理またはパラ
メータのセーブの後に、制御がブロック502に移行し
て、コマンド行のパラメータが更に存在するか否かを判
定し、存在する場合には、ブロック502に戻って次のパ
ラメータの処理を行う。
した後、ブロック510からブロック512に移行して、入力
ファイルおよび出力ファイルをオープンし、次いで、ブ
ロック514で、図8の関数yyparseを呼び出して、入力フ
ァイルに処理を行って図4の中間ファイル410にする。
入力ファイルの処理が完了した後、関数yyparseからブ
ロック516に戻ってファイルをクローズし、次いでブロ
ック518で、yaccプロセッサを実行して、中間ファイル4
10がyaccパーサジェネレータに入力ファイルとして与え
られる。このyaccパーサジェネレータは、図4にブロッ
ク408として示されている。好適実施例では、yaccパー
サジェネレータは、子プロセスとして実行されるが、関
数として呼び出すことも可能である。yaccの動作は、Ah
oによる参考文献およびMasonによる参考文献に記載のよ
うに当業界で周知のものであり、更なる説明は省略する
こととする。
が処理を完了した後にパーサ出力ファイル412が生成さ
れ、このファイルは、プリ/ポストプロセッサパーサ40
6によって後処理が行わなければならない。この後処理
を行うために、ブロック518からブロック602に移行し、
入力としてyacc出力ファイル412をオープンする。次い
でブロック604で、入力のために2パスドライバファイ
ル210(図2参照)をオープンし、ブロック606で、図2
および図4の出力ファイル212をオープンする。次いで
制御がブロック608に移行して、入力ファイル412から次
の行を得る。次いでブロック610で、入力ファイル全体
の処理が完了したか否かを判定し、完了していない場合
には、ブロック612に移行して、読み出したばかりの行
がドライバファイルの最初の行と同じであるか否かを判
定する。それら行が同じである場合には、ブロック612
からブロック614に移行して、シーケンス「@@@@」が生
じるまでドライバファイルの各行を出力ファイルにコピ
ーする。それらの行のコピーが完了した後、ブロック61
6で、入力ファイルからパーサコードを廃棄する。こう
して、2パスパーサドライバファイル210は、パーサ出
力ファイル412中にあるパーサドライバの関数yyparse()
をyaccパーサジェネレータ408に置き換える。入力ファ
イル412からパーサコードの関数yyparseを廃棄した後、
ブロック616からブロック608に戻って、入力ファイルか
ら次の行を得る。
ァイルの最初の行と一致しない場合には、ブロック612
からブロック618に移行し、その行がyyr2テーブルの開
始を含んでいるか否かを判定する。それを含んでいる場
合には、ブロック618からブロック620に移行して、入力
ファイルからテーブル項目を読み出し、次いでブロック
622で、yyr2テーブルに関してテーブル項目の調整を行
う。それらの項目は、定義済の各パーサ状態毎に、その
パーサの状態についてユーザプロダクションコードを実
行すべきか否かを示す情報を含めることにより、調整さ
れる。この調整に先立ち、yyr2アレイの下位ビットが、
標準的なyaccパーサドライバに対し、そのパーサの特定
の状態に関連した動作が存在するか否かを知らせる。ま
た、その調整後には、第2パスに備えて、両方のパス中
で実行すべきコードの有無を2パスパーサドライバに知
らせるために、エクストラビットが付加される。このエ
クストラビットは、第1パスに関する第1ビットと、第
2パスに関する第2ビットとを有している。テーブル項
目の調整後に、ブロック622からブロック608に戻って、
入力ファイルの次の行を読み出す。
でいない場合には、ブロック618からブロック702に移行
して、その行が定数「YYACCEPT」に関するdefineステー
トメントを含んでいるか否かを判定し、それを含んでい
ない場合には、制御がブロック704に移行して、そのdef
ineステートメントを_YACCEPTに変更した後に図6のブ
ロック608に戻って、次の入力行を読み出す。これは、
元のソースコードとのネーミング上の矛盾を回避するた
めに行われる。
テートメントを含んでいない場合には、制御がブロック
706に移行して、その行が「YYERROR」に関するdefineス
テートメントを含んでいるか否かを判定し、それを含ん
でいる場合には、ブロック706からブロック708に移行し
て、そのdefineステートメントを_YERRORに変更した
後、図6のブロック608に戻る。これは、元のソースコ
ードとのネーミング上の矛盾を回避するために行われ
る。
語であるか否かを判定し、そうである場合には、ブロッ
ク712に移行して、行番号パラメータに3を加算してそ
れを出力へコピーした後、図6のブロック608に戻る。
この行番号の調整は、修正済文法の始めに「#define TW
OPASS」が付加されるからである。
ク714で、出力ファイルに入力行を書き込み、次いでブ
ロック716で、その行がcaseステートメントを含んでい
るか否かを判定する。それが含まれている場合には、制
御がブロック718に戻り、そのcaseステートメントのケ
ース番号を変数LASTCASEに格納した後、ブロック720に
移行する。ブロック720で、キャラクタストリング「/*
TWO PASS:」により識別される2パスフラグが生じた
か否かを判定し、それが生じていれば、ブロック722
で、その2パスフラグからの最後のパス番号にOR演算
を行って上述の最後のケース番号に関するyyr2テーブル
項目とする。ストリング「/* TWO PASS:」は、各パー
サ動作毎にyyr2テーブルに対して如何なる調整を行うべ
きかについてポストプロセッサと連絡をとるためにプリ
プロセッサにより生成される。次いで制御は図6のブロ
ック608に戻る。
ると、ブロック624に移行して、出力ファイルに新しいy
yr2テーブルを書き込み、次いでブロック626で、ファイ
ルをクローズした後、オペレーティングシステムに戻
る。
ら呼び出される関数yyparseを示すフローチャートであ
る。同図では、図8のブロック802から入ることにな
る。ブロック802で、図10のスキャナのトークン関数
が呼び出される。スキャナは、入力ストリーム中で見つ
かった次のトークンを表す値を返す。ブロック802で
は、そのトークンがトークンPASS_DEFAULTであるか否
か、即ち、そのトークンがトークンPASS_DEFAULTを表す
値を有しているか否かを判定し、それがトークンPASS_D
EFAULTである場合には、ブロック806に移行して、その
トークンに続く数を変数DEFAULTPASSに格納し、次いで
ブロック802に戻って、次のトークンを取得する。その
トークンが或る識別子を表している場合には、ブロック
808からブロック810に移行して、その識別子をルッ
クアップテーブルに格納し、次いでブロック814に移
行して、そのトークンを出力ファイルに書き込んだ後、
ブロック802に戻って次のトークンを取得する。次のト
ークンがトークンMARKでない場合には、ブロック812か
らブロック814に移行して、そのトークンを出力ファイ
ルに書き込んだ後、ブロック802に戻って次のトークン
を取得する。このようにして、第1マークが検出される
まで、入力ファイルが読み出される。
ク812からブロック816に移行して、そのマークを出力フ
ァイルに書き込み、次いでブロック818で入力ファイル
から次のトークンを取得する。ブロック820では、次の
トークンがC_IDENTIFIERを表しているか否かを判定し、
それを表している場合には、ブロック822に移行して、
そのトークンをルックアップテーブルに格納し、次いで
ブロック826で、そのトークンを出力ファイルに書き込
んだ後、ブロック818に戻って次のトークンを取得す
る。次のトークンがIDENFIERを表している場合には、ブ
ロック824からブロック822に移行してその識別子をルッ
クアップテーブルに格納し、次いでブロック826でその
トークンを出力に書き込んだ後、ブロック818に戻る。
TIFIERも表さない場合には、制御が図9のブロック902
に移行して、そのトークンがトークンPASS_BLOCKである
か否かを判定する。そのトークンがトークンPASS_BLOCK
でない場合には、ブロック902からブロック904に移行し
てそのトークンを出力に書き込んだ後、図8のブロック
818に戻って次のトークンを取得する。また、前記トー
クンがトークンPASS_BLOCKである場合には、ブロック90
2からブロック906に移行してパス番号が現在既知のもの
であるか否かを判定し、既知のものである場合にはブロ
ック914に移行する。そのパス番号が既知のものでない
場合には、ブロック906からブロック908に移行してその
パス番号が確認されているか否かを判定し、そのパス番
号が確認されている場合には、ブロック910に移行し
て、それまでに確認された最高のパス番号を使用し、次
いでブロック914に移行する。パス番号が確認されなか
った場合には、ブロック908からブロック912に移行し
て、それ以降のコードについてデフォルトパス番号を使
用し、次いでブロック914に移行する。
トを出力ファイルに書き込み、次いでブロック916で、
トークンが正確なパスでのみ実行されるようにするifス
テートメントを書き込んだ後、ブロック808に戻って次
のトークンを取得する。前記ifステートメントは、それ
が実際に必要な場合にのみ書き込まれる。文法動作にお
ける全てのコードが2つのパスの一方でのみ実行される
場合には、その各パスで実行されるコードをyyr2テーブ
ルが制御することになる。また、パス1のコードとパス
2のコードとが混在している場合にはifステートメント
が必要となり、yyr2テーブルにより、文法動作を各パス
毎に実行することが可能になる。ほとんどの場合、各文
法動作は一方のパスでしか実行されないので、yypars
e()でのスイッチステートメントに対する実際の呼び出
しは不必要である。
わりを検出するまで続行され、その検出時に、図8から
図5のブロック516に戻る。
セッサスキャナ404を示すフローチャートであり、図5
ないし図7は、プリ/ポストプロセッサパーサ406を示
すフローチャートである。
図8のブロック802およびブロック818からパーサによっ
てスキャナが呼び出されると、制御が図10のブロック
1002に入る。ブロック1002で、入力ファイルから次のキ
ャラクタを読み出し、ブロック1004で、キャラクタシー
ケンス「*{」または「1{」または「2{」または「12{」
が生じたか否かを判定する。それが生じていない場合に
は、制御がブロック1006に移行して、シーケンス「pass
1{」または「pass2{」または「pass12{」または「pass*
{」が生じたか否かを判定する。ブロック1004またはブ
ロック1006で識別されるそれらのシーケンスのうちの何
れかが生じた場合には、制御がブロック1016に移行し
て、トークンPASS_BLOCKによって表される値に変数トー
クンの値をセットし、次いで制御が図12のブロック12
30に移行する。図12のブロック1230では、その見つけ
たばかりのトークンのための構造を構築し、次いでブロ
ック1232に移行して、そのトークンのための定数値(例
えばPASS_BLOCKのための値)と前記の構成したばかりの
構造とを呼び出し側のプログラムに返す。
ーケンスが生じなかった場合には、制御がブロック1008
に移行して、入力ストリームから数が読み出されたか否
かを判定する。数が読み出された場合には、制御がブロ
ック1018に移行して、変数トークンをトークンNUMBERの
値にセットし、制御が図12のブロック1230に移行す
る。また、そのシーケンスが数でない場合には、制御が
ブロック1010に移行して、そのシーケンスが、記
号「:」が後に続く有効な名称であるか否かを判定す
る。それが有効名である場合には、ブロック1020で、ト
ークンをC_IDENTIFIERにセットして、制御が図12のブ
ロック1230に移行する。また、コロンが後に続く名称が
生じなかった場合には、制御がブロック1011に移行し
て、そのシーケンスが、コロンが後に続かない名称であ
るか否かを判定する。前記シーケンスが、コロンが後に
続かない名称である場合には、制御がブロック1021に移
行して、トークンの値をIDENTIFIERにセットし、次いで
制御が図12のブロック1230に移行する。ブロック101
2,1014では、キャラクタ「%LEFT」および「%RIGHT」お
よびそれらの何れかが生じたか否かをチェックし、その
トークンの値をセットして、制御が図12のブロック12
30に移行する。
場合には、制御が図11のブロック1102に移行し、ブロ
ック1102〜1124で、パーセント符号で始まるキャラクタ
シーケンスを全てチェックし、それが見つかった場合に
は、トークンの値をセットして、制御が図12のブロッ
ク1230に移行する。また、パーセント符号で始まるキャ
ラクタシーケンスが全く見つからなかった場合には、制
御がブロック1126に移行して、2つのパーセント符号
(即ち、「%%」)からなるシーケンスが生じたか否かを
判定する。このシーケンスが生じた場合には、制御がブ
ロック1128に移行して、先行する等しいシーケンスが見
つかったか否かを判定する。このシーケンスは、マーク
と呼ばれ、読み出されるソースコード内の主な区切りを
識別する。先行するマークが見つかった場合、制御がブ
ロック1130に移行して、入力ファイルの残りをキャラク
タバッファにコピーし、次いでブロック1132に移行して
トークンの値をMARKにセットし、図12のブロック1230
に移行する。先行するマークが見つからなかった場合に
は、バッファへのコピーは行わないが、トークンの値を
セットして、制御がやはり図12のブロック1230に移行
する。マークシーケンスが見つからなかった場合には、
制御は図12のブロック1202に移行する。
ックを行い、何れかの特殊記号が見つかった場合には、
ブロック1204で、変数トークンを実際のキャラクタにセ
ットした後、ブロック1230に移行して、旧値の構造を構
築して返す。また、読み出されたキャラクタが特殊記号
のうちの1つでない場合には、制御がブロック1206に移
行して、シーケンス「%TWOPASS_DEFAULT」を探索し、そ
のシーケンスが見つかった場合には、制御がブロック12
08に移行してトークンをPASS_DEFAULTにセットして、ブ
ロック1230に移行する。また、シーケンス「%TWOPASS_D
EFAULT」が見つからなかった場合には、制御がブロック
1210に移行して、シーケンス「%{」を探索し、それが見
つかった場合には、ブロック1210からブロック1212に移
行して、終了シーケンス「%}」が見つかるまで全ての入
力キャラクタをキャラクタバッファにコピーする。それ
ら2つのシーケンスの間に、本システムのユーザは、所
望のあらゆるタイプの言語によるソースコードを挿入す
ることが可能であり、そのソースコードは出力に直接コ
ピーされることになる。その情報をキャラクタバッファ
にコピーした後、制御が図10のブロック1002に戻っ
て、次の入力文字の読み出しおよびその処理が行われ
る。
た場合には、制御がブロック1214に移行して「#」を探
索し、それが見つかった場合には、ブロック1216で、そ
の行と、その第1行の終わりにある継続キャラクタに続
く後続行とを、キャラクタバッファにコピーする。この
ようにして、ユーザは、言語マクロを入力し、出力に直
接コピーすることが可能になる。このキャラクタバッフ
ァへのコピーを行った後、ブロック1216からブロック10
02に戻って入力の次のキャラクタを読み出す。
には、ブロック1214からブロック1218に移行して、引用
符中のキャラクタストリングが見つかったか否かを判定
し、それが見つかった場合には、ブロック1220で、その
キャラクタストリングをキャラクタバッファへコピーし
て、制御がブロック1002に戻る。
見つからなかった場合には、ブロック1218からブロック
1222に移行して、数字ストリングが後続するドル符号が
見つかったか否かを判定する。それが見つからなかった
場合には、制御がブロック1224に移行し、如何なるキャ
ラクタが見つかろうともそれをキャラクタバッファにコ
ピーし、次いで制御がブロック1002に戻って次のキャラ
クタを読み出す。また、数字が後続するドル符号が見つ
かった場合には、制御がブロック1226に移行して、その
数を整数に変換し、ブロック1227で、変数トークンの値
を定数DOLLARにセットし、次いで制御がブロック1230に
移行して、そのトークンを呼び出し側のプログラムに返
す。
ブロック図である。同図において、2パスコンパイラ12
6には、その2パスコンパイラのユーザにより供給され
たソースコード1302が入力される。2パスコンパイラ
は、ソースコードファイル1302の処理を行ってパス1中
に構文解析ファイル1306を生成する。この構文解析ファ
イル1306が、以下で説明するようにパス2中に読み返さ
れて、出力1308が生成される。
パイラ126のためのパーサを示すフローチャートであ
る。この2パスコンパイラ126のパーサセクションは、
2パスパーサドライバ210からコピーされ、ファイル208
を介してパーサジェネレータ122から受け取ったユーザ
プロダクションコードと共に組み込まれる。ポストプロ
セッサ124は、ファイル208からのユーザプロダクション
コードを2パスパーサドライバ210からのコードと組み
合わせてソースファイル212を生成し、そのソースファ
イル212が、コンパイラ214によってコンパイルされた後
に、2パスコンパイラ126になる。もちろん、ユーザプ
ロダクションコードは、言語文法ファイル204と共にユ
ーザにより供給されるものであり、これ以上の説明は省
略することとする。
パスコンパイラが処理を開始すると、制御が図14のブ
ロック1402に入る。ブロック1402では、パーサで使用す
る全ての変数に初期値をセットし、ブロック1404で図2
1に示す関数を呼び出して、パーサを書込モードに切り
換える。パーサが書込モードにある場合には、パーサの
各状態が、コンパイラのパス2での使用に備えて構文解
析ファイルに書き込まれる。
ト制御レコードからなる線形シーケンスである。
レコードを示す特殊トークン値。
ーサ状態に関してデータレコードが後続する(twopass_s
aveから)ことを示す。また、前記状態がこれを特殊レコ
ードtwopass_callfuncと識別する場合にはエラー関数を
示す。また、デルタTWOPASS_VARの上位ビットを提供す
る。
を示す場合には、特殊コードのタイプである。通常の状
態の場合には、yaccに加えるべき新しいトークンの数が
スタックされる。
にデータレコードが後続することができる。
ク1406に戻って、ユーザにより供給された関数twopass_
begin_pass1を呼び出す。言語文法204(図2参照)内の
ユーザコードにより供給されるその関数によって、ユー
ザが、パス1コードの開始に先立ってあらゆる所望の操
作を行うことが可能になる。この関数は、必要に応じて
設けられるものであり、ユーザが組み込まねばならない
ものではない。
後、ブロック1408で、処理中のソースファイルから次の
トークンを取得する。そのトークンは、スキャナ関数を
利用して得られる。このスキャナは、ユーザにより供給
され、図10ないし図12に関連して上述したスキャナ
と同様の方法で、字句プログラムを用いて定義すること
が可能なものである。次いでブロック1410で、ソースフ
ァイルの終わりに達したか否かを判定し、達していない
場合には、制御がブロック1412に移行して、受信したト
ークンの構文解析を行って、実行すべきプロダクション
コードを(もし存在すれば)判定する。この構文解析
は、上述の当業界で周知のyaccパーサジェネレータを用
いて行われる。構文解析の実行プロセスでは、パーサ
は、特定のパーサ状態に達してその状態をブロック1414
に渡し、同ブロックで前記状態が構文解析ファイル(PAR
SEFILE)に書き込まれ、それがパス2で利用されること
になる。構文解析ファイルへの状態の書き込みが終了し
た後、ブロック1416で、その状態に関するユーザ動作の
有無を判定する。これは、動作を定義する、yyr2テーブ
ルへの索引として、前記状態を用いることにより判定さ
れる。その状態に関するyyr2テーブル中の項目が、動作
の存在を示している場合には、ブロック1416からブロッ
ク1418に移行してパラメータ値をセットする。次いでブ
ロック1420で、その状態に関して定義されたユーザパス
1またはユーザパス12動作を実行する。従って、パス2
またはパス12として指定された全ての動作が、この処理
ポイントで実行されることになる。ユーザ動作の実行
後、ブロック1420からブロック1408に戻って、次のトー
クンを得る。また、ユーザ動作が存在しない場合には、
ブロック1416からブロック1422に移行してyaccのスタッ
クを一掃した後、ブロック1408に戻る。このループは、
関数twopass_dopass2(以下の図28参照)に遭遇しな
い限り、入力ソースファイルの終わりに達するまで続行
される。前記関数twopass_dopass2に遭遇した際には、
このループは、パス2の処理が完了するまで中断され、
その後に再開されることになる。
構文解析ファイルにセーブされ、および、パス1または
パス12中に実行されるように定義されたプロダクション
だけが実際に実行されることになるという点を除けば、
従来の周知のコンパイラと同様のものである。入力ソー
スファイルの終わりに達すると、ブロック1410から図1
5のブロック1502に移行する。
第2パスに関する処理を示すフローチャートである。ブ
ロック1502で、ユーザにより供給される関数twopass_be
gin_pass2を呼び出す。上述の関数twopass_begin_pass1
と同様に、ユーザは、パス2処理の開始に先立って実行
されることになるコードを供給することができる。ユー
ザ関数から戻った後、ブロック1504で図22の関数を呼
び出して、構文解析ファイルの処理を読出モードに切り
換える。次いでブロック1506で、構文解析ファイルから
次の状態を読み出し、ブロック1507で、ファイルの終わ
りに達したか否かを判定する。ファイルの終わりに遭遇
した場合には、制御が呼び出し側のプログラムに戻り、
それ以外の場合には、ブロック1508で、その状態が特殊
状態であるか否かを判定する。特殊状態については以下
で定義することとする。その状態が特殊状態でない場合
には、ブロック1508からブロック1510に移行して、その
状態をyaccスタックに加え、その処理が可能になるよう
にする。
理を受ける状態のためのスタック(以下、状態スタック
と称す)と、各プロダクションに関連するトークン(お
よび先行プロダクションからの戻り値)のためのスタッ
ク(以下、トークンスタックと称す)とが存在する。第
1パス中には、状態スタックにプッシュされる状態が、
トークンスタックにおける最近の変更(最後の削減以降
に幾つのトークンが加えられたか)と共に中間ファイル
に格納される。また、第2パス中では、状態スタックは
問題とされない。これは、その状態が中間ファイル中で
線形順になるからである。しかし、状態情報と共に保持
されたトークンのカウントが与えられた場合にはトーク
ンスタックは維持される。従って、第2パスでは状態ス
タックは修正されず、トークンスタックのみが加えられ
る。また、両方のパスで、yyr2テーブル中の除去すべき
トークンのカウントが与えられた場合には、トークンス
タックは、プロダクションの削減によって削減される。
ユーザ動作の有無を判定する。これは、動作を定義す
る、yyr2テーブルへの索引として、前記状態を利用する
ことにより判定される。この状態に関するyyr2テーブル
中の項目が動作の存在を示している場合には、ブロック
1512からブロック1514に移行して、ブロック1506で読み
出したデータを取得し、パス1処理におけるそのポイン
トで存在したように、パラメータのパラメータ値をセッ
トする。次いでブロック1518で、その状態について定義
されたユーザパス1またはユーザパス12動作を実行す
る。従って、パス2またはパス12として指定された全て
の動作は、この処理ポイントで実行されることになる。
ユーザ動作の実施後、ブロック1518からブロック1506に
戻って、次の状態を読み出す。
動作が存在しないことを判定した場合には、ブロック15
16に移行して、構文解析ファイルからの次の状態の読み
出しに備えてyaccスタックを一掃した後、ブロック1506
に戻って次の状態を取得する。従って、上述のようにし
て、元の入力ソースファイルからのトークンの再構文解
析を必要とすることなく、2パス関数が全て達成され
る。
態であると判定した場合には、ブロック1508から図16
のブロック1602に移行する。特殊状態とは、構文解析フ
ァイルに挿入されてパス2の処理のための条件を設定す
る状態である。
_DOPASS2状態であるか否かを判定する。本システムのユ
ーザが要求することのできる操作の1つに、パス1処理
の中断およびパス2の即時処理がある。これは、ユーザ
プロダクションコード内のマクロTWOPASS_DOPASS2を用
いて行われる。そのマクロに遭遇した場合には、図28
のフローチャートが処理され、その結果としてパス1処
理からパス2処理に切り換わる。この切り換えが生じる
前に、トークンEND_OF_DOPASS2が構文解析ファイル中に
格納される。パス2処理中にこのトークンに遭遇した場
合には、ブロック1602からブロック1604に移行する。次
いでブロック1604で、ユーザにより供給された関数twop
ass_begin_pass1の2度目の実行を行い、または、マク
ロが多数回にわたって用いられる場合には後続回数だけ
実行し、次いでブロック1606で図21の関数を呼び出し
て書き込み状態へと逆に切り換わる。図21でその処理
が完了した場合には、制御が図14のブロック1408に戻
って、パス1処理が再開される。
場合には、ブロック1602からブロック1608に移行して、
その状態が状態TWOPASS_CALLFUNCであるか否かを判定す
る。ユーザが2パス呼び出し関数操作を実行すると、図
19で説明するコードが実行されて、状態TWOPASS_CALL
FUNC、および、パス2中で呼び出すべき関数の名称が、
その関数を呼び出すためのパラメータと共に構文解析フ
ァイルに格納される。この状態にパス2処理中に遭遇し
た場合には、ブロック1608からブロック1610に移行して
図25の関数を呼び出して、構文解析ファイルからパラ
メータを読み出す。次いでブロック1612で、それらのパ
ラメータをメモリ中に復元し、ブロック1614で、元のtw
opass_callfuncステートメントで指定された関数を呼び
出す。その関数の実行後、制御は図15のブロック1506
に戻る。
場合には、制御がブロック1616に戻って、その状態が変
数復元状態であるか否かを判定する。それが変数復元状
態である場合には、制御がブロック1618に移行して図2
5を呼び出して、その変数に関するデータを読み出し、
次いでブロック1620で、その読み取ったデータを変数に
格納する。その変数の復元後、または、前記状態が変数
復元状態でない場合には、制御が図15のブロック1506
に戻る。
任意のポイントで呼び出して変数のセーブおよび復元を
行うことが可能な関数TWOPASS_SAVEを示すフローチャー
トである。この関数はユーザプロダクションコードによ
り呼び出されるので、図14ないし図16の記述にはそ
の呼び出しは直接示していない。この関数が呼び出され
ると、ブロック1702で、まず要求される変数のサイズを
取得する。次いでブロック1704で、パス1が処理中か否
かを判定し、パス1が処理中である場合には、ブロック
1706に移行して、変数の内容をyysave_bufferに移送す
る。この内容は、上述のブロック1414で構文解析ファイ
ルにパーサ状態が書き込まれる際に書き込まれることに
なる。また、パス1が処理中でない場合には、ブロック
1704からブロック1708に移行して、パス2が処理中であ
るか否かを判定する。パス2が処理中である場合には、
ブロック1708からブロック1710に移行して、構文解析フ
ァイルから変数内容を読み出してメモリ中の変数位置に
戻す。その内容のセーブ後にその内容を復元し、また、
処理中のパスがパス1またはパス2でない場合には、図
17からその呼び出し側のプログラムに戻る。twopass_
saveは、ソースファイル中の同じポイントにおいて第1
パスまたは第2パスで呼び出される、という点に留意さ
れたい。
示すフローチャートである。文法内または文法外からこ
の関数を呼び出すと、ブロック1802で、そのコードがパ
ス1内にあるか否かを判定し、そのコードがパス1内に
ない場合には、単に呼び出し側のプログラムに戻ること
になる。これは、パス2中での変数の復元が、図16の
パス2の特殊状態コードで行われ、詳細には、ブロック
1618,1620で行われるからである。パス1が処理中であ
る場合には、ブロック1802からブロック1804に移行し
て、構文解析ファイルに変数復元状態を書き込み、次い
でブロック1806で、構文解析ファイルにデータタイプを
書き込む。最後に、ブロック1808で、構文解析ファイル
に実際のデータを書き込み、これが、上述のように復元
されることになる。
互いに関連のないものであり、独立した関数である。
基づいて2つの異なるものをセーブする。第1パス中に
は、twopass_saveは変数の内容を中間ファイルにセーブ
する。ファイルのサイズを縮小するために、何処でまた
は如何に変数を取得したかに関するレコードがその変数
と共にファイル中に格納されることはなく、そのデータ
のみが格納されることになる。また、第2パス中には、
twopass_saveは、第1パス中で以前に格納された変数の
値を復元する。第2パスでは、中間ファイル中に存在す
るものに関する情報が必要となるが、第1パス中におけ
る同じtwopass_saveの呼び出しが第2パス中で再び実行
されるので、前記情報は暗黙的に提供され、従って、第
2パスで実行される際には、第1パスで有していた同じ
情報が全て暗黙的に備わっていることになる。
られる。twopass_restoreを第2パス中の場合と全く同
様に再度実行する(これは文法外での実行が困難なもの
である)ことを要求する代わりに、第1のtwopass_rest
oreが、特殊レコードを中間ファイルに格納する。その
特殊レコードは、データと、そのデータが復元されるべ
き位置との両方を含むものである。このレコードが第2
パス中で処理される場合、そのデータは自動的に変数に
戻される。
な関数twopass_callfuncを示すフローチャートである。
上述のように、ユーザがこの関数を利用する場合には、
実際の関数呼び出しがパス1からパス2へ据え置かれ
る。ユーザは、パス2で呼び出すべき関数の名称と、そ
の関数に渡すべき引数とを提供する。関数が実行される
と、ブロック1902で図19のフローチャートが呼び出さ
れる。ブロック1902では、ユーザにより指定された引数
のリストを作成し、次いでブロック1904で、その関数が
パス1またはパス2から呼び出されているか否かを判定
する。関数がパス2から呼び出されている場合には、ブ
ロック1904からブロック1906に移行して、引数リストを
用いて関数を呼び出し、次いで呼び出し側のプログラム
に戻る。また、関数がパス1から呼び出されている場合
には、ブロック1904からブロック1908に移行して図20
を呼び出して、上述のように全てのTWOPASS_VARのデー
タをセーブする。次いでブロック1910で、それがtwopas
s_callfuncであること、幾つの引数が含まれるか、およ
び、その呼び出しが特殊エラータイプであるか否か、を
示す特殊レコードを、構文解析ファイルに書き込む。次
いでブロック1912で、引数のタイプを構文解析ファイル
に書き込む。次いでブロック1914で、関数のポインタを
構文解析ファイルに書き込み、次いでブロック1916で、
引数を構文解析ファイルに書き込む。これらが全て読み
出されて復元されて、パス2中で関数が呼び出されるこ
とになる。
関数yy_syncvarを示すフローチャートである。この処理
に入った後、ブロック2002で、デルタがセーブされてい
るか否か、あるいは、全変数がセーブされているか否か
を判定する。デルタは、変化が小さい場合に利用され
る。これは、小さな数づつインクリメントするのが普通
である行番号等のデータにとって極めて有用なものであ
る。構文解析ファイル中のレコードは、小さなデルタが
3ビット(最大値8まで)に納まるような態様で構成さ
れる。変化がそのスペースに納まらない場合には、新し
い値が書き込まれる。デルタは、中間ファイルのサイズ
を縮小するために用いられるが、絶対不可欠なものでは
ない。
ック2002からブロック2004に移行して、何れかのデータ
が変更されたか否かを判定し、変更がない場合には、単
純に呼び出し側のプログラムに戻る。また、データに変
更がある場合、またはデルタがセーブされていない場合
には、制御がブロック2006に移行して、TWOPASS_VARの
データを構文解析ファイルに書き込む。そのデータは、
図16に関連して上述した特殊状態のパス2処理中に復
元されることになる。
される書込モード切換関数を示すフローチャートであ
る。同図の処理に入った後、ブロック2102で、メモリ中
のバイト書込カウンタを調べることにより、構文解析フ
ァイルに何か書き込まれたか否かを判定する。構文解析
ファイル中に何らかのデータが書き込まれている場合に
は、ブロック2102からブロック2104に移行して、構文解
析ファイルを巻戻し(rewind)、次いでブロック2106で、
バッファ書込フラグをクリアする。そのフラグのクリア
後、または、構文解析ファイルに何も書き込まれていな
い場合には、制御がブロック2108に移行して、構文解析
バッファのポインタを始端にリセットし、次いでブロッ
ク2110で、変数TWOPASS_VARの全てをセーブ領域にコピ
ーした後、呼び出し側のプログラムに戻る。
回避するためにデータはできる限り圧縮される。また、
大きなバッファを用いて不必要なI/Oが回避される。多
くの場合、中間ファイルは、バッファサイズを超えて成
長することはないので、周辺装置に対するI/Oの必要が
回避される。また、構文解析ファイルは、逐次の読み出
しおよび書き込みしか行われず、速度を高めるために探
索は行われなない。
ード切換関数を示すフローチャートである。同図の処理
に入った後、ブロック2202で、メモリ中のバイト書込カ
ウンタを調べることにより、構文解析ファイルに何か書
き込まれたか否かを判定する。構文解析ファイルに何か
書き込まれている場合には、ブロック2202からブロック
2206に移行して、構文解析バッファの残りのデータを構
文解析ファイルに書き込み、次いでブロック2208で構文
解析ファイルを巻戻す。次いでブロック2210で、構文解
析バッファが保持することになるのと同量のデータを構
文解析ファイルから読み出す。
ていない場合には、ブロック2202からブロック2204に移
行して、構文解析バッファのポインタをリセットし、そ
のバッファの始端を指すようにする。そのポインタのリ
セット後、またはブロック2210で構文解析バッファへの
データを読み出した後、制御がブロック2212に移行し
て、上述の書込モード切換関数により変数TWOPASS_VAR
のデータが格納されたセーブ領域からそのデータの全て
をコピーして、呼び出し側プログラムに戻る。
込関数を示すフローチャートである。同図において、ブ
ロック2301で、構文解析バッファ中のデータの有無を示
すフラグを構造yysave中にセットする。次いでブロック
2302で、その構造yysaveを構文解析ファイルに書き込
み、ブロック2303で、バッファ中のデータの有無を判定
し、バッファ中にデータが存在する場合には、ブロック
2304に移行して、そのバッファ中のデータを構文解析フ
ァイルに書き込む。
ら呼び出される関数yywriteを示すフローチャートであ
る。同図の処理に入った後、ブロック2402で、構文解析
バッファにパラメータをコピーし、次いでブロック2404
で、構文解析バッファが満杯か否かを判定する。構文解
析バッファが満杯の場合には、ブロック2404からブロッ
ク2406に移行して、その構文解析バッファの内容を構文
解析ファイルに書き込み、次いでブロック2408で、構文
解析ファイルへのデータ書き込みがあったことを示す書
込バイトカウントをバイト書込カウンタに加える。構文
解析ファイルへのデータ書き込み後、または、バッファ
が満杯ではない場合には、図24からその呼び出し側の
プログラムに戻る。
位置から呼び出される関数yyreadを示すフローチャート
である。同図の処理に入った後、ブロック2502で、読み
出すよう要求されたデータを構文解析バッファからパラ
メータへコピーする。次いでブロック2504で、構文解析
バッファ中にデータが残っているか否かを判定し、デー
タが残っていない場合には、ブロック2506に移行して、
構文解析ファイルからバッファデータを読み出して構文
解析バッファの再充填を行う。構文解析バッファの再充
填後、または、構文解析バッファ中に更にデータが含ま
れている場合には、図25から呼び出し側プログラムに
戻る。
関数TWOPASS_SAVE_LOCを示すフローチャートである。関
数TWOPASS_STUFF_LOCと連係して利用されるこの関数に
より、ユーザは、情報をセーブし、その情報がセーブさ
れた位置よりも早期の処理位置においてパス2中でその
情報を利用できるようにすることが可能になる。関数TW
OPASS_STUFF_LOCは呼び出す必要はないが、その場合に
は、関数TWOPASS_SAVE_LOCは関数twopass_saveと同様の
働きをする。
った後、ブロック2602で、次の変数が格納されることに
なる構文解析バッファ中の位置を判定する。ブロック26
04で、その位置を構文解析バッファに書き込み、次いで
ブロック2606で図17(twopass_save)を呼び出して変
数をセーブする。次いでブロック2608で、その位置をユ
ーザに返す。
フローチャートである。同図の処理に入った後、ブロッ
ク2702で、早期のTWOPASS_SAVE_LOC呼び出しからの位置
を用いて構文解析ファイルから状態を読み出す。次いで
ブロック2704で、その状態がSAVE_LOCであるか否かを判
定し、その状態がSAVE_LOCである場合には、ブロック27
06に移行して、関数TWOPASS_SAVE_LOCにより識別された
位置に新しいデータをセーブする。そのデータのセーブ
後、または、前記状態がSAVE_LOCでない場合には、制御
が呼び出しプログラムに戻る。
s_dopass2を示すフローチャートである。この関数によ
り、2パスコンパイラは、パス1の操作を中断し、ソー
スファイルに関して既に定義済みの全てのパス2操作を
実行することになる。同図の処理に入った後、ブロック
2802で、構文解析バッファを構文解析ファイルに書き込
む。次いでブロック2804で、システムスタックに現在の
パーサ状態をセーブして、パス2処理の完了後にパス1
処理を再開できるようにする。次いでブロック2806で、
特殊状態END_OF_DOPASS2を構文解析ファイルに書き込
み、図15に移行してパス2処理を開始する。図15が
特殊状態END_OF_DOPASS2に遭遇すると、パス1処理が再
開される。
パイラを利用して実施されたコンパイラの一例を示すも
のである。リスト1(表1ないし表5)は入力ソースを
示し、リスト2(表6ないし表10)はそのソースに関
する中間ファイル410(図4参照)を示している。ま
た、参考資料Aは、本システムに関するユーザーズガイ
ドを含み、参考資料Bは、図10ないし図12で説明し
た字句スキャナのためのソースを含み、参考資料Cは、
図5ないし図9で説明したパーサについてのソースコー
ドを含み、参考資料Dは、図13ないし図28で説明し
た実行時間パーサについてのソースコードを含むもので
ある。
施例についての説明を終えるが、本発明の態様が完全に
実施されたことが理解されよう。また、当業者には明ら
かなように、本発明の思想および範囲を逸脱することの
ない本発明の構成および回路に対する多数の変更や多種
多様な実施例および用途は自明のものである。本明細書
における開示および説明は、例示を目的としたものであ
り、本発明の制限を意図したものではなく、本発明の範
囲は特許請求の範囲で好適に規定されている。
組み合わせからなる例示的な実施態様を示す。
ピュータ言語にコンパイルするためのコンピュータ実施
方法であって、前記コンパイルが少なくとも2回のコン
パイルパスを必要とするものにおいて、前記コンピュー
タ実施方法が、前記第1のコンピュータ言語を前記第2
のコンピュータ言語にコンパイルするためのパーサ状態
の複数の定義を含むと共に、前記パーサ状態の少なくと
も1つにおいて実施するための少なくとも1つのプロダ
クション関数を含むコンパイラ定義ファイルを読み出す
ステップと、及び前記コンパイラ定義ファイルを処理し
て前記第1のコンピュータ言語をコンパイルし、前記第
2のコンピュータ言語を生成するステップとからなり、
この生成ステップが、前記第1のコンピュータ言語のス
テートメントを含むソースファイルを読み出し、前記ソ
ースファイルの前記ステートメントの各々に含まれてい
る各々の記号毎に1つ宛の、複数のトークンを生成する
ステップと、前記トークンを構文解析して、前記トーク
ンについて前記複数のパーサ状態の何れを実施すべきか
を決定し、前記構文解析によって前記パーサ状態の各々
を実施する順序を規定するステップと、前記複数のパー
サ状態の各々の実施時に、実行に備えて識別された前記
プロダクション関数を全て実行するステップと、及び前
記パーサ状態をデータ記憶領域へと前記実施順に書き込
むステップとからなる第1のコンパイルパスを実行する
ステップと、前記データ記憶領域から前記パーサ状態を
前記実施順に検索するステップと、及び前記パーサ状態
の各々の実施時に、実行に備えて識別された前記プロダ
クション関数を全て実行し、前記プロダクション関数に
よって前記第2のコンピュータ言語を生成するステップ
とからなる第2のコンパイルパスを実施するステップと
からなり、前記第1と第2のコンパイルパスの両方を実
施するために前記ソースファイルが1回だけ処理され
る、コンピュータ実施方法。
記第1のコンパイルパス時の実行に備えて識別され、又
は前記第2のコンパイルパス時の実行に備えて識別さ
れ、或いは前記第1のコンパイルパスと前記第2のコン
パイルパスの両方における実行に備えて識別される、上
記1のコンピュータ実施方法。
れる前記プロダクション関数の少なくとも1つの実行時
にデータをセーブするステップと、前記第2のコンパイ
ルパス時の前記プロダクション関数の実行時に前記セー
ブされたデータを復元するステップとをさらに含み、前
記データのセーブ及び復元が、前記各パス時に前記パー
サ状態を実施する前記順序において同じ位置で行われ
る、上記1のコンピュータ実施方法。
前記パーサ状態の各々の実施の間に行われる、上記3の
コンピュータ実施方法。
前記コンパイルパスの各々において所定のプロダクショ
ン関数が実行される際に行われる、上記3のコンピュー
タ実施方法。
行に備えて、前記第1のコンパイルパスにおいて少なく
とも1つの関数を識別するステップをさらに含む、上記
3のコンピュータ実施方法。
なくとも1つの関数に受け渡すべきデータをセーブし、
前記第2のコンパイルパスにおいて前記少なくとも1つ
の関数を実行する際に、前記少なくとも1つの関数に前
記データを受け渡すステップをさらに含む、上記6のコ
ンピュータ実施方法。
プロダクション関数を実行する場合に、前記第1のコン
パイルパスの処理を中断し、前記第2のコンパイルパス
を実施して前記データ記憶領域に記憶された前記パーサ
状態の全てを前記第2のコンパイルパスで処理し、前記
第1のパスの処理を再開するステップをさらに含む、上
記1のコンピュータ実施方法。
れる前記プロダクション関数の少なくとも1つの実行時
にデータをセーブし、前記第2のコンパイルパス時にお
ける前記プロダクション関数の実行時に前記セーブされ
たデータを復元するステップをさらに含み、前記データ
が、前記第1のコンパイルパスにおいて前記パーサ状態
を実施する前記順序中の第1の位置にセーブされ、前記
第2のコンパイルパスにおいて前記パーサ状態を実施す
る前記順序中の先行位置で復元される、上記1のコンピ
ュータ実施方法。
前記第1のコンパイルパスにおいて実行される際に前記
セーブ位置が識別され、第2の所定のプロダクション関
数が前記第1のコンパイルパスにおいて実行される際に
前記データがセーブされる、上記9のコンピュータ実施
方法。
ンピュータ言語にコンパイルするためのコンピュータ実
施方法であって、前記コンパイルが少なくとも2回のコ
ンパイルパスを必要とするものにおいて、前記コンピュ
ータ実施方法が、前記第1のコンピュータ言語を前記第
2のコンピュータ言語にコンパイルするためのパーサ状
態の複数の定義を含むコンパイラ定義ファイルを読み出
し、前記コンパイラ定義ファイルが前記パーサ状態の少
なくとも1つにおいて実施するための少なくとも1つの
プロダクション関数を含み、また前記少なくとも1つの
プロダクション関数の各々が前記第1のコンパイルパス
時の実行に備えて識別され、又は前記第2のコンパイル
パス時の実行に備えて識別され、或いは前記第1のコン
パイルパスと前記第2のコンパイルパスの両方における
実行に備えて識別されるステップと、及び前記コンパイ
ラ定義ファイルを処理して前記第1のコンピュータ言語
をコンパイルし、前記第2のコンピュータ言語を生成す
るステップとからなり、この生成ステップが、前記第1
のコンピュータ言語のステートメントを含むソースファ
イルを読み出し、前記ソースファイルの前記ステートメ
ントの各々に含まれている各々の記号毎に1つ宛の、複
数のトークンを生成するステップと、前記トークンを構
文解析して、前記トークンについて前記複数のパーサ状
態の何れを実施すべきかを決定し、前記構文解析によっ
て前記パーサ状態の各々を実施する順序を規定するステ
ップと、前記複数のパーサ状態の各々の実施時に前記第
1のコンパイルパスにおいて実行に備えて識別された前
記プロダクション関数を全て実行し、前記複数のパーサ
状態の各々の実施時に前記両方のコンパイルパスにおい
て実行に備えて識別された前記プロダクション関数を全
て実行するステップと、及び前記パーサ状態をデータ記
憶領域へと前記実施順に書き込むステップとからなる前
記第1のコンパイルパスを実行するステップと、前記デ
ータ記憶領域から前記パーサ状態を前記実施順に検索す
るステップと、及び前記パーサ状態の各々の実施時に前
記第2のコンパイルパスにおいて実行に備えて識別され
た前記プロダクション関数を全て実行し、前記パーサ状
態の各々の実施時に前記両方のコンパイルパスにおいて
実行に備えて識別された前記プロダクション関数を全て
実行し、前記プロダクション関数によって前記第2のコ
ンピュータ言語を生成するステップとからなる第2のコ
ンパイルパスを実施するステップとからなり、前記第1
と第2のコンパイルパスの両方を実施するために前記ソ
ースファイルが1回だけ処理される、コンピュータ実施
方法。
される前記プロダクション関数の少なくとも1つの実行
時にデータをセーブするステップと、前記第2のコンパ
イルパス時の前記プロダクション関数の実行時に前記セ
ーブされたデータを復元するステップとをさらに含み、
前記データのセーブ及び復元が、前記各パス時に前記パ
ーサ状態を実施する前記順序において同じ位置で行われ
る、上記11のコンピュータ実施方法。
が、前記パーサ状態の各々の実施の間に行われる、上記
12のコンピュータ実施方法。
が、前記コンパイルパスの各々において所定のプロダク
ション関数が実行される際に行われる、上記12のコン
ピュータ実施方法。
実行に備えて、前記第1のコンパイルパスにおいて少な
くとも1つの関数を識別するステップをさらに含む、上
記11のコンピュータ実施方法。
少なくとも1つの関数に受け渡すべきデータをセーブ
し、前記第2のコンパイルパスにおいて前記少なくとも
1つのプロダクション関数を実行する際に、前記少なく
とも1つのプロダクション関数に前記データを受け渡す
ステップをさらに含む、上記15のコンピュータ実施方
法。
のプロダクション関数を実行する場合に、前記第1のコ
ンパイルパスの処理を中断し、前記第2のコンパイルパ
スを実施して前記データ記憶領域に記憶された前記パー
サ状態の全てを前記第2のコンパイルパスで処理し、前
記第1のパスの処理を再開するステップをさらに含む、
上記11のコンピュータ実施方法。
される前記プロダクション関数の少なくとも1つの実行
時にデータをセーブし、前記第2のコンパイルパス時に
おける前記プロダクション関数の実行時に前記セーブさ
れたデータを復元するステップをさらに含み、前記デー
タが、前記第1のコンパイルパスにおいて前記パーサ状
態を実施する前記順序中の第1の位置にセーブされ、前
記第2のコンパイルパスにおいて前記パーサ状態を実施
する前記順序中の先行位置で復元される、上記11のコ
ンピュータ実施方法。
前記第1のコンパイルパスにおいて実行される際に前記
セーブ位置が識別され、第2の所定のプロダクション関
数が前記第1のコンパイルパスにおいて実行される際に
前記データがセーブされる、上記18のコンピュータ実
施方法。
ンピュータ言語にコンパイルするためのコンピュータ実
施方法であって、前記コンパイルが少なくとも2回のコ
ンパイルパスを必要とするものにおいて、前記コンピュ
ータ実施方法が、前記第1のコンピュータ言語を前記第
2のコンピュータ言語にコンパイルするためのパーサ状
態の複数の定義を含むと共に、前記パーサ状態の少なく
とも1つにおいて実施するための少なくとも1つのプロ
ダクション関数を含むコンパイラ定義ファイルを読み出
すステップと、及び前記コンパイラ定義ファイルを処理
して前記第1のコンピュータ言語をコンパイルし、前記
第2のコンピュータ言語を生成するステップとからな
り、この生成ステップが、前記第1のコンピュータ言語
のステートメントを含むソースファイルを読み出し、前
記ソースファイルの前記ステートメントの各々に含まれ
ている各々の記号毎に1つ宛の、複数のトークンを生成
するステップと、前記トークンを構文解析して、前記ト
ークンについて前記複数のパーサ状態の何れを実施すべ
きかを決定し、前記構文解析によって前記パーサ状態の
各々を実施する順序を規定するステップと、前記複数の
パーサ状態の各々の実施時に、実行に備えて識別された
前記プロダクション関数を全て実行するステップと、及
び前記パーサ状態をデータ記憶領域へと前記実施順に書
き込むステップとからなるスキャンコンパイルパスを実
行するステップと、前記データ記憶領域から前記パーサ
状態を前記実施順に検索するステップと、及び前記パー
サ状態の各々の実施時に、実行に備えて識別された前記
プロダクション関数を全て実行し、前記プロダクション
関数によって前記第2のコンピュータ言語を生成するス
テップとからなる前記スキャンコンパイルパスに後続す
る少なくとも1つのパスを実施するステップとからな
り、前記スキャンコンパイルパスと前記スキャンコンパ
イルパスに後続する少なくとも1つのパスの両方を実施
するために前記ソースファイルが1回だけ処理される、
コンピュータ実施方法。
前記スキャンコンパイルパス時の実行に備えて識別さ
れ、又は前記スキャンコンパイルパスに後続する少なく
とも1つのパス時の実行に備えて識別され、或いは前記
スキャンコンパイルパスと前記スキャンコンパイルパス
に後続する少なくとも1つのパスにおける実行に備えて
識別される、上記20のコンピュータ実施方法。
行される前記プロダクション関数の少なくとも1つの実
行時にデータをセーブするステップと、前記スキャンコ
ンパイルパスに後続する少なくとも1つのパス時の前記
プロダクション関数の実行時に前記セーブされたデータ
を復元するステップとをさらに含み、前記データのセー
ブ及び復元が、前記スキャンコンパイルパスに後続する
前記パスの各々において前記パーサ状態を実施する前記
順序でもって同じ位置で行われる、上記20のコンピュ
ータ実施方法。
が、前記パーサ状態の各々の実施の間に行われる、上記
22のコンピュータ実施方法。
が、前記コンパイルパスの各々において所定のプロダク
ション関数が実行される際に行われる、上記22のコン
ピュータ実施方法。
する前記少なくとも1つのパスにおける実行に備えて、
前記スキャンコンパイルパスにおいて少なくとも1つの
関数を識別するステップをさらに含む、上記20のコン
ピュータ実施方法。
記少なくとも1つの関数に受け渡すべきデータをセーブ
し、前記スキャンコンパイルパスに後続する前記少なく
とも1つのパスにおいて前記少なくとも1つの関数を実
行する際に、前記少なくとも1つの関数に前記データを
受け渡すステップをさらに含む、上記25のコンピュー
タ実施方法。
定のプロダクション関数を実行する場合に、前記スキャ
ンコンパイルパスの処理を中断し、前記スキャンコンパ
イルパスに後続する前記少なくとも1つのパスを実施し
て前記データ記憶領域に記憶された前記パーサ状態の全
てを処理し、前記スキャンコンパイルパスの処理を再開
するステップをさらに含む、上記20のコンピュータ実
施方法。
行される前記プロダクション関数の少なくとも1つの実
行時にデータをセーブし、前記スキャンコンパイルパス
に後続する前記少なくとも1つのパス時における前記プ
ロダクション関数の実行時に前記セーブされたデータを
復元するステップをさらに含み、前記データが、前記ス
キャンコンパイルパスにおいて前記パーサ状態を実施す
る前記順序中の第1の位置にセーブされ、前記スキャン
コンパイルパスに後続する前記少なくとも1つのパスに
おいて前記パーサ状態を実施する前記順序中の先行位置
で復元される、上記20のコンピュータ実施方法。
前記スキャンコンパイルパスにおいて実行される際に前
記セーブ位置が識別され、第2の所定のプロダクション
関数が前記スキャンコンパイルパスにおいて実行される
際に前記データがセーブされる、上記28のコンピュー
タ実施方法。
ース入力を1回しか処理しない高効率の2パス言語コン
パイラを提供することができる。
すブロック図である。
を示すブロック図である。
る。
ロセッサブロックを示すブロック図である。
ートである。
ャートである(1/2)。
チャートである(2/2)。
ーチャートである(1/2)。
ーチャートである(2/2)。
すフローチャートである(1/3)。
すフローチャートである(2/3)。
すフローチャートである(3/3)。
ロック図である。
を示すフローチャートである(1/3)。
を示すフローチャートである(2/3)。
を示すフローチャートである(3/3)。
関数twopass_saveを示すフローチャートである。
関数twopass_restoreを示すフローチャートである。
関数twopass_callfuncを示すフローチャートである。
すフローチャートである。
ード切換関数を示すフローチャートである。
を示すフローチャートである。
フローチャートである。
フローチャートである。
readを示すフローチャートである。
save_locを示すフローチャートである。
stuff_locを示すフローチャートである。
dopass2を示すフローチャートである。
Claims (1)
- 【請求項1】第1のコンピュータ言語を第2のコンピュ
ータ言語にコンパイルするためのコンピュータ実施方法
であって、前記コンパイルが少なくとも2回のコンパイ
ルパスを必要とするものにおいて、前記コンピュータ実
施方法が、 前記第1のコンピュータ言語を前記第2のコンピュータ
言語にコンパイルするためのパーサ状態の複数の定義を
含むと共に、前記パーサ状態の少なくとも1つにおいて
実施するための少なくとも1つのプロダクション関数を
含むコンパイラ定義ファイルを読み出すステップと、及
び前記コンパイラ定義ファイルを処理して前記第1のコ
ンピュータ言語をコンパイルし、前記第2のコンピュー
タ言語を生成するステップとからなり、この生成ステッ
プが、 前記第1のコンピュータ言語のステートメントを含むソ
ースファイルを読み出し、前記ソースファイルの前記ス
テートメントの各々に含まれている各々の記号毎に1つ
宛の、複数のトークンを生成するステップと、 前記トークンを構文解析して、前記トークンについて前
記複数のパーサ状態の何れを実施すべきかを決定し、前
記構文解析によって前記パーサ状態の各々を実施する順
序を規定するステップと、 前記複数のパーサ状態の各々の実施時に、実行に備えて
識別された前記プロダクション関数を全て実行するステ
ップと、及び前記パーサ状態をデータ記憶領域へと前記
実施順に書き込むステップとからなる第1のコンパイル
パスを実行するステップと、 前記データ記憶領域から前記パーサ状態を前記実施順に
検索するステップと、及び前記パーサ状態の各々の実施
時に、実行に備えて識別された前記プロダクション関数
を全て実行し、前記プロダクション関数によって前記第
2のコンピュータ言語を生成するステップとからなる第
2のコンパイルパスを実施するステップとからなり、 前記第1と第2のコンパイルパスの両方を実施するため
に前記ソースファイルが1回だけ処理される、コンピュ
ータ実施方法。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US08/066,687 US5386570A (en) | 1993-05-24 | 1993-05-24 | Method for a two pass compiler with the saving parse states from first to second pass |
US066687 | 1993-05-24 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH07141201A true JPH07141201A (ja) | 1995-06-02 |
JP3648268B2 JP3648268B2 (ja) | 2005-05-18 |
Family
ID=22071051
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP10986494A Expired - Fee Related JP3648268B2 (ja) | 1993-05-24 | 1994-05-24 | 2パスコンパイラのための改良された方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US5386570A (ja) |
JP (1) | JP3648268B2 (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8838440B2 (en) | 2010-09-14 | 2014-09-16 | International Business Machines Corporation | Generating parser combination by combining language processing parsers |
Families Citing this family (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5812853A (en) * | 1994-04-11 | 1998-09-22 | Lucent Technologies Inc. | Method and apparatus for parsing source code using prefix analysis |
EP0702294A3 (en) * | 1994-09-13 | 1997-05-02 | Sun Microsystems Inc | Method and device for diagnosing lexical errors |
US5671416A (en) * | 1995-02-24 | 1997-09-23 | Elson; David | Apparatus and a method for searching and modifying source code of a computer program |
CA2175711A1 (en) * | 1996-05-01 | 1997-11-02 | Lee Richard Nackman | Incremental compilation of c++ programs |
US5867175A (en) * | 1996-05-24 | 1999-02-02 | Microsoft Corporation | Method and apparatus for scriping animation |
US5991539A (en) * | 1997-09-08 | 1999-11-23 | Lucent Technologies, Inc. | Use of re-entrant subparsing to facilitate processing of complicated input data |
US6651247B1 (en) | 2000-05-09 | 2003-11-18 | Hewlett-Packard Development Company, L.P. | Method, apparatus, and product for optimizing compiler with rotating register assignment to modulo scheduled code in SSA form |
GB0107882D0 (en) * | 2001-03-29 | 2001-05-23 | Ibm | Parsing messages with multiple data formats |
US7089541B2 (en) * | 2001-11-30 | 2006-08-08 | Sun Microsystems, Inc. | Modular parser architecture with mini parsers |
US20040006763A1 (en) * | 2002-06-28 | 2004-01-08 | Van De Vanter Michael L. | Undo/redo technique with insertion point state handling for token-oriented representation of program code |
US7386834B2 (en) * | 2002-06-28 | 2008-06-10 | Sun Microsystems, Inc. | Undo/redo technique for token-oriented representation of program code |
US20040003374A1 (en) * | 2002-06-28 | 2004-01-01 | Van De Vanter Michael L. | Efficient computation of character offsets for token-oriented representation of program code |
US7062755B2 (en) * | 2002-10-16 | 2006-06-13 | Hewlett-Packard Development Company, L.P. | Recovering from compilation errors in a dynamic compilation environment |
US7194733B2 (en) * | 2003-06-11 | 2007-03-20 | Microsoft Corporation | Transformation of an asynchronous transactional messaging language into a web services compatible language |
US7395497B1 (en) * | 2003-10-31 | 2008-07-01 | Emc Corporation | System and methods for processing large datasets |
WO2006009959A2 (en) * | 2004-06-21 | 2006-01-26 | Equestron Llc | Method and apparatus for evaluating animals' health and performance |
US8090873B1 (en) * | 2005-03-14 | 2012-01-03 | Oracle America, Inc. | Methods and systems for high throughput information refinement |
US8589788B2 (en) * | 2007-12-19 | 2013-11-19 | International Business Machines Corporation | Methods, systems, and computer program products for automatic parsing of markup language documents |
US8352509B2 (en) * | 2007-12-19 | 2013-01-08 | International Business Machines Corporation | Methods, systems, and computer program products for accessing a multi-format data object |
CN102902568B (zh) | 2011-07-27 | 2016-08-17 | 国际商业机器公司 | 一种用于处理应用程序的内容表访问溢出的方法和系统 |
US9043757B2 (en) * | 2012-12-13 | 2015-05-26 | Oracle International Corporation | Identifying differences between source codes of different versions of a software when each source code is organized using incorporated files |
US10509653B2 (en) * | 2017-02-10 | 2019-12-17 | Intel Corporation | Vector processing system |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4667290A (en) * | 1984-09-10 | 1987-05-19 | 501 Philon, Inc. | Compilers using a universal intermediate language |
US4914585A (en) * | 1988-05-23 | 1990-04-03 | Hewlett-Packard Company | Modular complier with a class independent parser and a plurality of class dependent parsers |
US5170456A (en) * | 1988-09-07 | 1992-12-08 | Fujikura Ltd. | Apparatus for aligning a plurality of single-fiber cables |
US5230049A (en) * | 1988-11-29 | 1993-07-20 | International Business Machines Corporation | Program source code translator |
US5193191A (en) * | 1989-06-30 | 1993-03-09 | Digital Equipment Corporation | Incremental linking in source-code development system |
US5182806A (en) * | 1989-06-30 | 1993-01-26 | Digital Equipment Corporation | Incremental compiler for source-code development system |
US5276881A (en) * | 1990-06-25 | 1994-01-04 | Hewlett-Packard Company | ANDF producer using the HPcode-Plus compiler intermediate language |
-
1993
- 1993-05-24 US US08/066,687 patent/US5386570A/en not_active Expired - Lifetime
-
1994
- 1994-05-24 JP JP10986494A patent/JP3648268B2/ja not_active Expired - Fee Related
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8838440B2 (en) | 2010-09-14 | 2014-09-16 | International Business Machines Corporation | Generating parser combination by combining language processing parsers |
Also Published As
Publication number | Publication date |
---|---|
US5386570A (en) | 1995-01-31 |
JP3648268B2 (ja) | 2005-05-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JPH07141201A (ja) | 2パスコンパイラのための改良された方法 | |
US5963742A (en) | Using speculative parsing to process complex input data | |
Wirth | PL360, a programming language for the 360 computers | |
US5487147A (en) | Generation of error messages and error recovery for an LL(1) parser | |
US5778212A (en) | Interprocedural analysis user interface | |
Johnson | Yacc: Yet another compiler-compiler | |
US5813019A (en) | Token-based computer program editor with program comment management | |
US5586328A (en) | Module dependency based incremental compiler and method | |
US5182806A (en) | Incremental compiler for source-code development system | |
US5170465A (en) | Incremental-scanning compiler for source-code development system | |
US5325531A (en) | Compiler using clean lines table with entries indicating unchanged text lines for incrementally compiling only changed source text lines | |
EP0343882B1 (en) | A computer system and method adapted for task automation and instruction delivery | |
US5201050A (en) | Line-skip compiler for source-code development system | |
US5752058A (en) | System and method for inter-token whitespace representation and textual editing behavior in a program editor | |
US5991539A (en) | Use of re-entrant subparsing to facilitate processing of complicated input data | |
US5812855A (en) | System and method for constaint propagation cloning for unknown edges in IPA | |
EP0752649A2 (en) | System and method for textual editing of structurally-represented computer programs with on-the-fly typographical display | |
Graham et al. | Practical LR error recovery | |
US7213243B2 (en) | Program optimization by unused data item | |
US5301327A (en) | Virtual memory management for source-code development system | |
AU638999B2 (en) | Incremental compiler for source-code development system | |
US5150474A (en) | Method for transferring arguments between object programs by switching address modes according to mode identifying flag | |
Graham et al. | Practical syntactic error recovery in compilers | |
Beetem et al. | Incremental scanning and parsing with Galaxy | |
Barnard et al. | Hierarchic syntax error repair for LR grammars |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20040615 |
|
A601 | Written request for extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A601 Effective date: 20040915 |
|
A602 | Written permission of extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A602 Effective date: 20040921 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20041215 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20050201 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20050214 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090218 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100218 Year of fee payment: 5 |
|
LAPS | Cancellation because of no payment of annual fees |