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
Application number
JP6109864A
Other languages
English (en)
Other versions
JP3648268B2 (ja
Inventor
Gregory S Lindhorst
グレゴリー・エス・リンドホルスト
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
HP Inc
Original Assignee
Hewlett Packard Co
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hewlett Packard Co filed Critical Hewlett Packard Co
Publication of JPH07141201A publication Critical patent/JPH07141201A/ja
Application granted granted Critical
Publication of JP3648268B2 publication Critical patent/JP3648268B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Classifications

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

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

(57)【要約】 【目的】 ソース入力を1回しか処理しない高効率の2
パス言語コンパイラを提供すること 【構成】 コンピュータプログラミング言語の入力ソー
スコードを第1のパスに際してスキャン及び構文解析
し、再生すべきパーサ状態を第2のパスに際してセーブ
するシステムである。従ってソースファイルは再スキャ
ンされることはなく、また第2のパスに際して再度構文
解析されることもない。パーサ状態は、第2のパスに際
して再生され、文法中の全ての構文解析動作は、第2の
パスにおいて、それらが第1のパスにおける実際の構文
解析において当初記録されたのと同じ順序で再度実行さ
れる。このことは元の入力言語を再度スキャンして再度
構文解析する必要性を排除し、コンパイラの処理時間を
短縮させる。ユーザは各々のパスに際してどのコードを
実行するかを指定し、システムはまたパス間の通信のた
めの便宜をも提供する。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、コンピュータシステム
に関し、特に、コンピュータシステム内の言語コンパイ
ラに関し、とりわけ、高効率の2パス言語コンパイラの
生成方法に関する。
【0002】
【従来の技術】コンパイラは、デジタルコンピュータで
実行されて或る言語を別の言語に変換するプログラムで
ある。一般に、変換対象となるソース言語と呼ばれる言
語は、プログラミング技術における当業者であるコンピ
ュータプログラマが容易に読み取り理解することができ
る言語である。ソース言語は一般に、オブジェクト言語
へと翻訳される。このオブジェクト言語は、そのコンパ
イラ自体が実行されるコンピュータのためのマシン語で
ある場合が多い、オブジェクト言語またはマシン語は、
一般にコンピュータ自体にしか理解できないものであ
る。
【0003】コンパイラは、一般にソース言語の各ステ
ートメントを読み出し、そのステートメントを1つ以上
のオブジェクト言語ステートメントへと翻訳する。言語
によっては、「前方参照(forward reference)」が可能
であり、その場合には、ソースファイル中の或る位置に
おける言語ステートメントが、そのソースファイル中の
後続ポイントで発生する情報を参照することになる。ソ
ースファイル中の後続ポイントで情報が発生する場合、
コンパイラは、ソース言語のステートメントを1回読み
出しただけではその翻訳を完成することができない。こ
れは、前方参照がどこに位置しているかコンパイラが知
らないからである。従って、前方参照が可能な場合に
は、コンパイラは、マシンコードまたは後で最適化され
る中間コード等のオブジェクト言語へとソースコードを
完全にコンパイルするために、ソースコードに対して2
回以上のパスを実行しなければならない。
【0004】コンパイラは、字句スキャナおよびパーサ
と呼ばれる2つの主要セクションを用いて構成されるこ
とが多い。字句スキャナは、単にスキャナと呼ばれるこ
とが多く、ソースステートメントを読み出して、そのソ
ースステートメントからの各ワード記号または数を「ト
ークン」へと分割する。その各トークンには参照記号
(数である場合が多い)が付与され、この参照記号がコ
ンパイラのパーサセクションに送られる。コンパイラの
パーサセクションは、多数のトークンに処理を行って、
それらトークンをその言語で有効なステートメントへと
分割する。即ち、スキャナがソースコードをトークンの
ストリームへと分割し、パーサが、その多数のトークン
を解析して、そのトークンがその言語内のステートメン
トと一致するか否かを判定する。パーサが、1つ以上の
トークンと言語内における有効なステートメントとの間
に一致を見つけると、パーサ動作ルーチンが呼び出され
て、その言語のステートメントに対応するオブジェクト
言語コードが出力されることになる。
【0005】コンパイラに関する多数パスは、多様な形
態をとることが可能なものである。その一形態は、第1
パス中にソース言語のスキャンおよび構文解析を行っ
て、そのソース言語中の変数に関する必要とされるタイ
プ情報を求め、次いでそのタイプ情報を用いて第2パス
中に再びソース言語の再スキャンおよび再構文解析を行
って、オブジェクト言語コードを実際に生成する。従っ
て、第1パスによって全情報の位置が決定され、これに
より、第2パス中には全ての前方参照が既知のものとな
って、正確なオブジェクト言語コードを生成することが
可能になる。この技法を利用して既存の1パスコンパイ
ラをマルチパスコンパイラに変更することは比較的容易
ではあるが、この方法は、ソースコードのスキャンおよ
び構文解析を2回行うことを必要とし、このため、ソー
ス言語コードをオブジェクト言語コードにコンパイルす
るのに必要な時間が大幅に増加することになる。また、
別の方法では、ソースコードのスキャンおよび構文解析
を1回実行して、パーズツリーだけしか用いない第2パ
スに備えて必要なタイプ情報およびパーズツリーをセー
ブする。この技法もまた、良好に機能するものではある
が、一般にコンパイラ全体の基本設計に影響を与えるこ
とになり、例えば、第2パスのために構文解析規則を別
個に規定する必要が生じ、このため、既存のコンパイラ
を1パスから2パスに改良する場合には困難なプロセス
を伴うことになる。
【0006】ほとんどの場合、ソースコードをオブジェ
クト言語コードにうまく変換するために必要なのは2パ
スだけである。
【0007】従って、ソース言語の再スキャンおよび再
構文解析を行うことのない効率的な2パスコンパイラ
が、当業界で必要とされている。更に、旧式の1パスコ
ンパイラを2パスコンパイラに改良する能力を備えたコ
ンパイラライタにとって理解し易いコンパイラが、当業
界で必要とされている。更に、両方のパスに関するコー
ドを共にコンパイラのソースコード中に保持する2パス
コンパイラが、当業界で必要とされている。
【0008】
【発明が解決しようとする課題】本発明の目的は、コン
ピュータシステム用の2パス言語コンパイラを作成する
方法を提供することにある。
【0009】本発明の別の目的は、ソース入力が1回し
か処理されないコンパイラを作成することにある。
【0010】本発明の別の目的は、コンパイラの状態を
収容した中間ファイルを利用することにある。
【0011】本発明の更に別の目的は、両方のパスにつ
いての構文解析命令を単一位置で提供することを可能に
することにある。
【0012】
【課題を解決するための手段】本発明の上述その他の目
的は、入力ソースコードのスキャンおよび構文解析を第
1パス中に行い、再生すべきパーサ状態を第2パス中に
セーブするシステムで達成される。従って、第2パス中
には、ソースファイルの再スキャンも再構文解析も行わ
れない。パーサ状態が第2パス中に再生され、その第2
パス中に文法中の全てのパーサ動作が、第1パスにおけ
る実際の構文解析中に当初に記録されたのと同じ順序で
実質的に再実行される。これにより、元の入力言語の再
スキャンおよび再構文解析を行う必要がなくなり、コン
パイラの処理時間が短縮される。
【0013】ユーザは、各文法動作において、各パス中
にどのコードを実行すべきかを文法で指定する。このシ
ステムは、文法内および文法外の両方で、2つのパスの
間の効率的な通信のための便宜を提供する。更に、文法
外のコンパイラソースコードのために、手順の呼び出し
を据え置き、変数値をセーブして自動的に復元し、コン
パイラのエラーメッセージを容易に取り扱うための便宜
も提供するものである。これらにより、既存の1パスコ
ンパイラの迅速で容易な改変が可能となる。
【0014】本発明の上述その他の目的、特徴、および
利点は、図面に関連して進める以下の詳細な説明を参照
することにより、一層良好に理解されよう。
【0015】
【実施例】以下の説明は、現在企図する本発明の最良の
実施態様に関するものである。本説明は、制限的な意味
に解釈されるべきものではなく、単に本発明の一般的原
理を説明することを目的としたものである。本発明の範
囲は、特許請求の範囲により判断されるべきである。
【0016】本発明は、2つのユーティリティプログラ
ム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)と題する文献に解説されている。
【0017】2パスコンパイラを作成するために本発明
に入力される言語文法は、別の2パス指示語を有する標
準的なyacc文法である。この文法での各パーサ動作の実
行は、後述する文法中の規定により制限されない限り、
正確に2回実行される。2つの各パスにおいてパーサ動
作を実行させる制御、およびその2つのパス間での通信
は、後述の指示語によって容易化される。
【0018】コンパイルすべき言語に関する文法を作成
するプログラマは、2つのパスのそれぞれについて各パ
ーサ動作においてどのコードを実行すべきかを指定す
る。この指定は、パススコープを用いて行われる。それ
らの特殊なパススコープは、文法内で通常のスコープを
使用することができる部分であればどこでも使用するこ
とができ、更に、そのスコープ内に含まれるコードを実
行すべきパスがどれであるかを指定する。例えば、下記
の2パスパーサ動作について考える。
【0019】 この例の場合、def_name()は第1パスにおいてのみ呼び
出される。第2パス中には、このパーサ動作は何もしな
い。利用可能なパススコープは下記の通りである。
【0020】 更なる例示のため、下記にもう1つの例を示す。この例
の場合、printfの呼び出しが各パスで1回だけ実行され
る。
【0021】 第1パスで作業の一部を行い、第2パスでその作業を続
行するのが望ましい場合が極めて多い。また、字句スキ
ャナは、第1パス中にソースコードのスキャンしか行わ
ないので、第2パス中には、そのスキャナにより生成さ
れるトークンと、恐らくは字句スキャナの何らかの状態
とが必要とされる可能性がある。
【0022】TWOPASS_SAVE()と呼ばれる関数は、パーサ
動作における第1パスコードの後に値をセーブし、次い
で、それと同じパーサ動作における第2パスコードの実
行中にそのセーブ値を復元する手段を提供する。コンパ
イラが第1パスを実行する際に、関数TWOPASS_SAVEによ
り識別された変数が、そのTWOPASS_SAVEの呼び出しが発
生したポイントでセーブされ、コンパイラが第2パスを
実行する際に、その変数がやはりTWOPASS_SAVEの呼び出
しが発生したポイントで復元され、これにより、その変
数が第2パス中で利用可能となるようになっている。
【0023】例えば、下記のコードの場合には、SICON
が第1パス中にキャラクタのポインタを返し、何らかの
理由で追加操作を第2パスまで据え置く必要があるもの
と仮定する。
【0024】 add: SICON ‘+' SICON *{ int a,b; 1{ a=atoi($1);/*aはその値をパス1で得る*/ b=atoi($3);/*bはその値をパス1で得る*/ } TWOPASS_SAVE(a); /*aはパス1でセーブされ、パス2で復元される*/ TWOPASS_SAVE(b); /*bはパス1でセーブされ、パス2で復元される*/ 2{ $$=a+b;/*aおよびbはパス2で最終的に使用される/* } }; 第1パス中で、「a」および「b」は、関数ATOIへの関数
呼び出しから返された数値を得る。次いで、それらの変
数の値が関数TWOPASS_SAVEの呼び出しによってセーブさ
れてパーサ動作が完了する。第2パス中に、aおよびbの
値がTWOPASS_SAVEの呼び出し位置で復元され、それらの
値が合計されて、第2パススコープに含まれるコード中
の変数$$が生成される。これらの値は、第1パス中でそ
れらの値が発生した位置と同じトークンストリーム中の
位置で第2パス中に復元される。例えば、上記のパーサ
動作は、第1パス中に多数回にわたって実行することが
可能であり、それに対応する第2パス中での各実行によ
り、前記第1パス中でのコードの実行が発生する毎に、
その位置に格納されている値が復元される。
【0025】関数TWOPASS_SAVEは、両方のパス中で実行
されなければならないので、パススコープ12{}中に含ま
れなければならない。これは、上記の例の場合にはTWOP
ASS_SAVEが、*{ で始まるスコープ中にあるので、満た
されている。
【0026】文法規則外で行われる関数については、付
加的な能力が提供される。変数「yypass」は、現在のパ
ス番号(1または2)を含む整数型の変数である。yypa
rse()がまだ呼び出されていないかまたは終了している
場合には、変数yypassの値はゼロとなる。
【0027】コンパイラは、第1パス中で関数呼び出し
を規定する能力を有しているが、第2パス中でのトーク
ンストリームの再生において、そのトークンが第1パス
中でパーサにより当初に処理された場合と同じ位置ま
で、関数の実際の呼び出しを据え置く。この関数は、tw
opass_callfunc()と呼ばれ、第1パス中のtwopass_call
func()の位置と同じ入力トークンストリーム中のポイン
トで、第2パス中に或る関数が呼び出されるようにす
る。これは、文法を直接関連させることなく作業を据え
置くのに極めて有用な関数である。
【0028】例えば、第1パス中および第2パス中にユ
ーザエラーメッセージを生成するコンパイラについて考
察する。そのエラーメッセージは、入力言語に基づいて
順に現れるのが望ましい(即ち、行nに関する全てのエ
ラーは、行n+1に関するエラーの前にプリントされ
る)。以下の関数は、この場合を取り扱ったものであ
る。
【0029】 void error(char *str, int line) { if(yypass==1) { twopass_callfunc(error, "%s%d" , str, line); return; } fprintf(stderr, "Compiler Error, Line %d: %s\n", line, str); } 第1パス中でerror()が呼び出される場合、twopass_cal
lfunc()を呼び出してそれと同じ位置で第2パス中でエ
ラー関数が呼び出されて、fprintステートメントがソー
ス中の同じポイントで第2パス中にのみ実際に実行され
るようになる。error()が第2パス中で呼び出される場
合には、その関数は単にfprintfを呼び出すことにな
る。
【0030】twopass_callfuncに対するパラメータに
は、呼び出すべき関数の名称(Cプログラミング言語の
場合には、関数名の代わりに、その関数に対するポイン
タが用いられる)と、その関数が実際に呼び出された際
にその関数に渡される引数とが含まれる。
【0031】関数呼び出しの据え置きと同様の方法によ
り、変数内容を、第1パス中で入力トークンストリーム
中の位置に有していた値と同じ値へと第2パス中で復元
することが可能である。これは、twopass_restoreと呼
ばれる関数を用いて行われる。twopass_restoreは、第
1パス中で呼び出された際に変数の内容をセーブする。
その変数内容は、第2パス中での入力トークンストリー
ムの再生時と同じ位置で第2パス中に復元される(以下
の図18に関する説明を参照のこと)。twopass_restor
eは、2つのパラメータを受容する。その第1パラメー
タは変数のポインタであり、第2パラメータは変数のバ
イトで表したサイズである。twopass_restoreは局所変
数に利用することはできない。これは、局所変数のアド
レスがパス毎に変化することがあるからである。
【0032】例えば、構文解析が行われる行の行数を含
む変数のように、変数によっては、パス1とパス2との
両方について常に同じ値を有していることが必要な場合
がある。コンパイラは、最新の状態に保つ必要のあるこ
れら変数を取り扱うための機構を提供する。この機構
は、「TWOPASS_VAR」と呼ばれ、twopass_restoreより一
層効率の良いものである。これは、TWOPASS_VARが、自
動的にデータをセーブして復元するからであり、これに
対し、関数twopass_restoreは、自動的に復元するだけ
であり、ユーザは依然としてセーブのための関数を呼び
出す必要がある。機構TWOPASS_VARは、以下のように、
Cプログラミング言語によるプリプロセッサのステート
メント「#define」により実施される。
【0033】 #define TWOPASS_VAR1 lineno #define TWOPASS_VAR1_TYPE int 上記2つのステートメントの場合、例えば、コンパイラ
は、2つのパス間でlinenoを維持する。即ち、それがパ
ス1で変化すると、パス1で変化した各位置においてパ
ス2でも変化することになる。この機構は、好適実施例
の場合には、3つの変数に限定され、それらは文法のヘ
ッダ部でのみ定義することができる。
【0034】通常は、ファイルの終わりが見つかったこ
とを示すEOFトークンおよびソースコードがスキャナに
より返された際に、第1パスが終了して、第2パスが開
始される。しかし、任意のポイントで、コンパイラに対
し、パス1の処理を強制的に中止させて、直ちにパス2
の処理を開始させることが可能である。指示語「TWOPAS
S_DOPASS2」は、第1パスの終了および第2パスの開始
を直ちに発生させる。第2パスが完了すると、スキャナ
からの新しいトークンを用いて第1パスが再開する。即
ち、第1パスが単に中断される一方、第2パスが入力ト
ークンストリーム中のその同じポイントまで処理され
る。これにより、使用されるダイナミックメモリおよび
中間ファイルサイズの縮小が可能となる。恐らくは、第
2パスの完了後に、手順記号テーブル等の、指示語まで
の情報を排除することができるので、メモリの使用量が
減少し、また第1パスでの中間ファイルの再開始以降は
中間ファイルが小さくなる。
【0035】致命的なエラーを検出し、その回復が不可
能である場合には、コンパイラは、一般にそのポイント
で動作を停止する。しかし、上述の据え置かれた関数の
呼び出しのためにエラーメッセージがプリントされなか
った可能性があるので、コンパイラは、その実行を停止
する前に全てのエラーメッセージをプリントする機構を
提供する。この関数は、twopass_error_callfunc()と呼
ばれる。この関数は、その呼び出し時に、待ち行列に入
っている全てのtwopass_callfunc()をさかのぼって、エ
ラーに関連するものを呼び出し、エラーメッセージがプ
リント出力されることになる。この関数の呼び出しの
後、コンパイラは、その回復不可能なエラーに起因して
実行を停止することができる。
【0036】このシステムはまた、各パスの開始時に呼
び出される2つの関数を提供して、各パスの開始時に行
う必要のある初期設定を可能にするものである。
【0037】図1は、本発明を組み込んだコンピュータ
システムを示すブロック図である。同図のコンピュータ
システム100は処理要素102を備えている。この処理素子
102は、システムバス104を介してコンピュータシステム
100の他の要素との通信を行うものである。キーボード1
06は、このコンピュータシステムのユーザによるこのシ
ステムへのテキスト入力を可能にし、またマウス110
は、このコンピュータシステムへのグラフィックデータ
入力を可能にする。グラフィックディスプレイ108は、
このシステムのユーザに対してテキスト情報およびグラ
フィック情報の表示を行うことを可能にする。ディスク
112は、本発明のソフトウェアおよびデータファイルを
格納するものである。
【0038】メモリ116は、オペレーティングシステム1
18を備えたものであり、このオペレーティングシステム
118により、本発明のソフトウェアがこのシステムの様
々な入出力装置との通信を行うことが可能になる。プリ
/ポストプロセッサ120およびパーサジェネレータ122が
使用されて、ディスク112から言語の文法情報が読み出
され、オブジェクト言語の言語コマンドに処理を加えて
このコンピュータシステムのユーザのためのコードを生
成する2パスコンパイラ126が生成される。
【0039】図2は、本発明の2パスコンパイラを生成
するためのプロセスを示すブロック図である。同図にお
いて、ディスク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に格
納される。
【0040】図3は、本発明の2パスコンパイラの動作
を示すブロック図である。同図において、ディスク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内での実行に適したコンパイル
されたコードである。
【0041】図4は、図2のプリプロセッサブロック12
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参照)に送る。
【0042】図5ないし図7は、図4のプリ/ポストプ
ロセッサパーサ406を示すフローチャートである。図5
のブロック502でプリ/ポストプロセッサパーサに入
る。ブロック502に入ると、同ブロックで、入力コマン
ド行で送られた最初のまたは次のパラメータを得る。ブ
ロック504では、そのパラメータがシーケンス「-tp:」
で始まるか否かを判定し、シーケンス「-tp:」で始まる
場合には、ブロック506に移行して、2パスコンパイラ
のためにそのパラメータの処理を行う。また、そのパラ
メータがシーケンス「-tp:」で始まらない場合には、ブ
ロック504からブロック508に移行して、yaccに送るべき
パラメータをセーブする。パラメータの処理またはパラ
メータのセーブの後に、制御がブロック502に移行し
て、コマンド行のパラメータが更に存在するか否かを判
定し、存在する場合には、ブロック502に戻って次のパ
ラメータの処理を行う。
【0043】全てのコマンド行パラメータの処理が完了
した後、ブロック510からブロック512に移行して、入力
ファイルおよび出力ファイルをオープンし、次いで、ブ
ロック514で、図8の関数yyparseを呼び出して、入力フ
ァイルに処理を行って図4の中間ファイル410にする。
入力ファイルの処理が完了した後、関数yyparseからブ
ロック516に戻ってファイルをクローズし、次いでブロ
ック518で、yaccプロセッサを実行して、中間ファイル4
10がyaccパーサジェネレータに入力ファイルとして与え
られる。このyaccパーサジェネレータは、図4にブロッ
ク408として示されている。好適実施例では、yaccパー
サジェネレータは、子プロセスとして実行されるが、関
数として呼び出すことも可能である。yaccの動作は、Ah
oによる参考文献およびMasonによる参考文献に記載のよ
うに当業界で周知のものであり、更なる説明は省略する
こととする。
【0044】yaccパーサジェネレータ408(図4参照)
が処理を完了した後にパーサ出力ファイル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に戻って、入力ファイルか
ら次の行を得る。
【0045】また、読み出したばかりの行がドライバフ
ァイルの最初の行と一致しない場合には、ブロック612
からブロック618に移行し、その行がyyr2テーブルの開
始を含んでいるか否かを判定する。それを含んでいる場
合には、ブロック618からブロック620に移行して、入力
ファイルからテーブル項目を読み出し、次いでブロック
622で、yyr2テーブルに関してテーブル項目の調整を行
う。それらの項目は、定義済の各パーサ状態毎に、その
パーサの状態についてユーザプロダクションコードを実
行すべきか否かを示す情報を含めることにより、調整さ
れる。この調整に先立ち、yyr2アレイの下位ビットが、
標準的なyaccパーサドライバに対し、そのパーサの特定
の状態に関連した動作が存在するか否かを知らせる。ま
た、その調整後には、第2パスに備えて、両方のパス中
で実行すべきコードの有無を2パスパーサドライバに知
らせるために、エクストラビットが付加される。このエ
クストラビットは、第1パスに関する第1ビットと、第
2パスに関する第2ビットとを有している。テーブル項
目の調整後に、ブロック622からブロック608に戻って、
入力ファイルの次の行を読み出す。
【0046】また、前記行がyyr2テーブルの開始を含ん
でいない場合には、ブロック618からブロック702に移行
して、その行が定数「YYACCEPT」に関するdefineステー
トメントを含んでいるか否かを判定し、それを含んでい
ない場合には、制御がブロック704に移行して、そのdef
ineステートメントを_YACCEPTに変更した後に図6のブ
ロック608に戻って、次の入力行を読み出す。これは、
元のソースコードとのネーミング上の矛盾を回避するた
めに行われる。
【0047】また、前記行がYYACCEPTに関するdefineス
テートメントを含んでいない場合には、制御がブロック
706に移行して、その行が「YYERROR」に関するdefineス
テートメントを含んでいるか否かを判定し、それを含ん
でいる場合には、ブロック706からブロック708に移行し
て、そのdefineステートメントを_YERRORに変更した
後、図6のブロック608に戻る。これは、元のソースコ
ードとのネーミング上の矛盾を回避するために行われ
る。
【0048】ブロック710では、入力行が行番号の指示
語であるか否かを判定し、そうである場合には、ブロッ
ク712に移行して、行番号パラメータに3を加算してそ
れを出力へコピーした後、図6のブロック608に戻る。
この行番号の調整は、修正済文法の始めに「#define TW
OPASS」が付加されるからである。
【0049】これらが何れも生じない場合には、ブロッ
ク714で、出力ファイルに入力行を書き込み、次いでブ
ロック716で、その行がcaseステートメントを含んでい
るか否かを判定する。それが含まれている場合には、制
御がブロック718に戻り、そのcaseステートメントのケ
ース番号を変数LASTCASEに格納した後、ブロック720に
移行する。ブロック720で、キャラクタストリング「/*
TWO PASS:」により識別される2パスフラグが生じた
か否かを判定し、それが生じていれば、ブロック722
で、その2パスフラグからの最後のパス番号にOR演算
を行って上述の最後のケース番号に関するyyr2テーブル
項目とする。ストリング「/* TWO PASS:」は、各パー
サ動作毎にyyr2テーブルに対して如何なる調整を行うべ
きかについてポストプロセッサと連絡をとるためにプリ
プロセッサにより生成される。次いで制御は図6のブロ
ック608に戻る。
【0050】ブロック610でファイルの終わりを検出す
ると、ブロック624に移行して、出力ファイルに新しいy
yr2テーブルを書き込み、次いでブロック626で、ファイ
ルをクローズした後、オペレーティングシステムに戻
る。
【0051】図8および図9は、図5のブロック514か
ら呼び出される関数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マークが検出される
まで、入力ファイルが読み出される。
【0052】第1マークが検出された場合には、ブロッ
ク812からブロック816に移行して、そのマークを出力フ
ァイルに書き込み、次いでブロック818で入力ファイル
から次のトークンを取得する。ブロック820では、次の
トークンがC_IDENTIFIERを表しているか否かを判定し、
それを表している場合には、ブロック822に移行して、
そのトークンをルックアップテーブルに格納し、次いで
ブロック826で、そのトークンを出力ファイルに書き込
んだ後、ブロック818に戻って次のトークンを取得す
る。次のトークンがIDENFIERを表している場合には、ブ
ロック824からブロック822に移行してその識別子をルッ
クアップテーブルに格納し、次いでブロック826でその
トークンを出力に書き込んだ後、ブロック818に戻る。
【0053】また、次のトークンがC_IDENTIFIERもIDEN
TIFIERも表さない場合には、制御が図9のブロック902
に移行して、そのトークンがトークンPASS_BLOCKである
か否かを判定する。そのトークンがトークンPASS_BLOCK
でない場合には、ブロック902からブロック904に移行し
てそのトークンを出力に書き込んだ後、図8のブロック
818に戻って次のトークンを取得する。また、前記トー
クンがトークンPASS_BLOCKである場合には、ブロック90
2からブロック906に移行してパス番号が現在既知のもの
であるか否かを判定し、既知のものである場合にはブロ
ック914に移行する。そのパス番号が既知のものでない
場合には、ブロック906からブロック908に移行してその
パス番号が確認されているか否かを判定し、そのパス番
号が確認されている場合には、ブロック910に移行し
て、それまでに確認された最高のパス番号を使用し、次
いでブロック914に移行する。パス番号が確認されなか
った場合には、ブロック908からブロック912に移行し
て、それ以降のコードについてデフォルトパス番号を使
用し、次いでブロック914に移行する。
【0054】ブロック914では、パス番号を示すコメン
トを出力ファイルに書き込み、次いでブロック916で、
トークンが正確なパスでのみ実行されるようにするifス
テートメントを書き込んだ後、ブロック808に戻って次
のトークンを取得する。前記ifステートメントは、それ
が実際に必要な場合にのみ書き込まれる。文法動作にお
ける全てのコードが2つのパスの一方でのみ実行される
場合には、その各パスで実行されるコードをyyr2テーブ
ルが制御することになる。また、パス1のコードとパス
2のコードとが混在している場合にはifステートメント
が必要となり、yyr2テーブルにより、文法動作を各パス
毎に実行することが可能になる。ほとんどの場合、各文
法動作は一方のパスでしか実行されないので、yypars
e()でのスイッチステートメントに対する実際の呼び出
しは不必要である。
【0055】この処理は、ブロック819でファイルの終
わりを検出するまで続行され、その検出時に、図8から
図5のブロック516に戻る。
【0056】図10ないし図12は、プリ/ポストプロ
セッサスキャナ404を示すフローチャートであり、図5
ないし図7は、プリ/ポストプロセッサパーサ406を示
すフローチャートである。
【0057】ここで、図10ないし図12を参照する。
図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のための値)と前記の構成したばかりの
構造とを呼び出し側のプログラムに返す。
【0058】また、ブロック1004,1006で識別されるシ
ーケンスが生じなかった場合には、制御がブロック1008
に移行して、入力ストリームから数が読み出されたか否
かを判定する。数が読み出された場合には、制御がブロ
ック1018に移行して、変数トークンをトークンNUMBERの
値にセットし、制御が図12のブロック1230に移行す
る。また、そのシーケンスが数でない場合には、制御が
ブロック1010に移行して、そのシーケンスが、記
号「:」が後に続く有効な名称であるか否かを判定す
る。それが有効名である場合には、ブロック1020で、ト
ークンをC_IDENTIFIERにセットして、制御が図12のブ
ロック1230に移行する。また、コロンが後に続く名称が
生じなかった場合には、制御がブロック1011に移行し
て、そのシーケンスが、コロンが後に続かない名称であ
るか否かを判定する。前記シーケンスが、コロンが後に
続かない名称である場合には、制御がブロック1021に移
行して、トークンの値をIDENTIFIERにセットし、次いで
制御が図12のブロック1230に移行する。ブロック101
2,1014では、キャラクタ「%LEFT」および「%RIGHT」お
よびそれらの何れかが生じたか否かをチェックし、その
トークンの値をセットして、制御が図12のブロック12
30に移行する。
【0059】それらのシーケンスの何れも生じなかった
場合には、制御が図11のブロック1102に移行し、ブロ
ック1102〜1124で、パーセント符号で始まるキャラクタ
シーケンスを全てチェックし、それが見つかった場合に
は、トークンの値をセットして、制御が図12のブロッ
ク1230に移行する。また、パーセント符号で始まるキャ
ラクタシーケンスが全く見つからなかった場合には、制
御がブロック1126に移行して、2つのパーセント符号
(即ち、「%%」)からなるシーケンスが生じたか否かを
判定する。このシーケンスが生じた場合には、制御がブ
ロック1128に移行して、先行する等しいシーケンスが見
つかったか否かを判定する。このシーケンスは、マーク
と呼ばれ、読み出されるソースコード内の主な区切りを
識別する。先行するマークが見つかった場合、制御がブ
ロック1130に移行して、入力ファイルの残りをキャラク
タバッファにコピーし、次いでブロック1132に移行して
トークンの値をMARKにセットし、図12のブロック1230
に移行する。先行するマークが見つからなかった場合に
は、バッファへのコピーは行わないが、トークンの値を
セットして、制御がやはり図12のブロック1230に移行
する。マークシーケンスが見つからなかった場合には、
制御は図12のブロック1202に移行する。
【0060】図12のブロック1202で、特殊記号のチェ
ックを行い、何れかの特殊記号が見つかった場合には、
ブロック1204で、変数トークンを実際のキャラクタにセ
ットした後、ブロック1230に移行して、旧値の構造を構
築して返す。また、読み出されたキャラクタが特殊記号
のうちの1つでない場合には、制御がブロック1206に移
行して、シーケンス「%TWOPASS_DEFAULT」を探索し、そ
のシーケンスが見つかった場合には、制御がブロック12
08に移行してトークンをPASS_DEFAULTにセットして、ブ
ロック1230に移行する。また、シーケンス「%TWOPASS_D
EFAULT」が見つからなかった場合には、制御がブロック
1210に移行して、シーケンス「%{」を探索し、それが見
つかった場合には、ブロック1210からブロック1212に移
行して、終了シーケンス「%}」が見つかるまで全ての入
力キャラクタをキャラクタバッファにコピーする。それ
ら2つのシーケンスの間に、本システムのユーザは、所
望のあらゆるタイプの言語によるソースコードを挿入す
ることが可能であり、そのソースコードは出力に直接コ
ピーされることになる。その情報をキャラクタバッファ
にコピーした後、制御が図10のブロック1002に戻っ
て、次の入力文字の読み出しおよびその処理が行われ
る。
【0061】また、シーケンス「%{」が見つからなかっ
た場合には、制御がブロック1214に移行して「#」を探
索し、それが見つかった場合には、ブロック1216で、そ
の行と、その第1行の終わりにある継続キャラクタに続
く後続行とを、キャラクタバッファにコピーする。この
ようにして、ユーザは、言語マクロを入力し、出力に直
接コピーすることが可能になる。このキャラクタバッフ
ァへのコピーを行った後、ブロック1216からブロック10
02に戻って入力の次のキャラクタを読み出す。
【0062】また、符号「#」が見つからなかった場合
には、ブロック1214からブロック1218に移行して、引用
符中のキャラクタストリングが見つかったか否かを判定
し、それが見つかった場合には、ブロック1220で、その
キャラクタストリングをキャラクタバッファへコピーし
て、制御がブロック1002に戻る。
【0063】また、引用符中のキャラクタストリングが
見つからなかった場合には、ブロック1218からブロック
1222に移行して、数字ストリングが後続するドル符号が
見つかったか否かを判定する。それが見つからなかった
場合には、制御がブロック1224に移行し、如何なるキャ
ラクタが見つかろうともそれをキャラクタバッファにコ
ピーし、次いで制御がブロック1002に戻って次のキャラ
クタを読み出す。また、数字が後続するドル符号が見つ
かった場合には、制御がブロック1226に移行して、その
数を整数に変換し、ブロック1227で、変数トークンの値
を定数DOLLARにセットし、次いで制御がブロック1230に
移行して、そのトークンを呼び出し側のプログラムに返
す。
【0064】図13は、2パスコンパイラの動作を示す
ブロック図である。同図において、2パスコンパイラ12
6には、その2パスコンパイラのユーザにより供給され
たソースコード1302が入力される。2パスコンパイラ
は、ソースコードファイル1302の処理を行ってパス1中
に構文解析ファイル1306を生成する。この構文解析ファ
イル1306が、以下で説明するようにパス2中に読み返さ
れて、出力1308が生成される。
【0065】図14ないし図16は、図2の2パスコン
パイラ126のためのパーサを示すフローチャートであ
る。この2パスコンパイラ126のパーサセクションは、
2パスパーサドライバ210からコピーされ、ファイル208
を介してパーサジェネレータ122から受け取ったユーザ
プロダクションコードと共に組み込まれる。ポストプロ
セッサ124は、ファイル208からのユーザプロダクション
コードを2パスパーサドライバ210からのコードと組み
合わせてソースファイル212を生成し、そのソースファ
イル212が、コンパイラ214によってコンパイルされた後
に、2パスコンパイラ126になる。もちろん、ユーザプ
ロダクションコードは、言語文法ファイル204と共にユ
ーザにより供給されるものであり、これ以上の説明は省
略することとする。
【0066】次に、図14ないし図16を参照する。2
パスコンパイラが処理を開始すると、制御が図14のブ
ロック1402に入る。ブロック1402では、パーサで使用す
る全ての変数に初期値をセットし、ブロック1404で図2
1に示す関数を呼び出して、パーサを書込モードに切り
換える。パーサが書込モードにある場合には、パーサの
各状態が、コンパイラのパス2での使用に備えて構文解
析ファイルに書き込まれる。
【0067】構文解析ファイルは、下記の形態の2バイ
ト制御レコードからなる線形シーケンスである。
【0068】ビット0〜10 :新しい状態、または、特殊
レコードを示す特殊トークン値。
【0069】ビット11 :多用途:これは、通常のパ
ーサ状態に関してデータレコードが後続する(twopass_s
aveから)ことを示す。また、前記状態がこれを特殊レコ
ードtwopass_callfuncと識別する場合にはエラー関数を
示す。また、デルタTWOPASS_VARの上位ビットを提供す
る。
【0070】ビット12〜15:新しい状態が特殊レコード
を示す場合には、特殊コードのタイプである。通常の状
態の場合には、yaccに加えるべき新しいトークンの数が
スタックされる。
【0071】制御レコードに加えて、その制御レコード
にデータレコードが後続することができる。
【0072】書込モードに切り換えた後、制御がブロッ
ク1406に戻って、ユーザにより供給された関数twopass_
begin_pass1を呼び出す。言語文法204(図2参照)内の
ユーザコードにより供給されるその関数によって、ユー
ザが、パス1コードの開始に先立ってあらゆる所望の操
作を行うことが可能になる。この関数は、必要に応じて
設けられるものであり、ユーザが組み込まねばならない
ものではない。
【0073】ユーザにより供給された関数から戻った
後、ブロック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の処理が完了するまで中断され、
その後に再開されることになる。
【0074】従って、パス1の処理は、各パーサ状態が
構文解析ファイルにセーブされ、および、パス1または
パス12中に実行されるように定義されたプロダクション
だけが実際に実行されることになるという点を除けば、
従来の周知のコンパイラと同様のものである。入力ソー
スファイルの終わりに達すると、ブロック1410から図1
5のブロック1502に移行する。
【0075】図15および16は、2パスコンパイラの
第2パスに関する処理を示すフローチャートである。ブ
ロック1502で、ユーザにより供給される関数twopass_be
gin_pass2を呼び出す。上述の関数twopass_begin_pass1
と同様に、ユーザは、パス2処理の開始に先立って実行
されることになるコードを供給することができる。ユー
ザ関数から戻った後、ブロック1504で図22の関数を呼
び出して、構文解析ファイルの処理を読出モードに切り
換える。次いでブロック1506で、構文解析ファイルから
次の状態を読み出し、ブロック1507で、ファイルの終わ
りに達したか否かを判定する。ファイルの終わりに遭遇
した場合には、制御が呼び出し側のプログラムに戻り、
それ以外の場合には、ブロック1508で、その状態が特殊
状態であるか否かを判定する。特殊状態については以下
で定義することとする。その状態が特殊状態でない場合
には、ブロック1508からブロック1510に移行して、その
状態をyaccスタックに加え、その処理が可能になるよう
にする。
【0076】実際には、2つのyaccスタック、即ち、処
理を受ける状態のためのスタック(以下、状態スタック
と称す)と、各プロダクションに関連するトークン(お
よび先行プロダクションからの戻り値)のためのスタッ
ク(以下、トークンスタックと称す)とが存在する。第
1パス中には、状態スタックにプッシュされる状態が、
トークンスタックにおける最近の変更(最後の削減以降
に幾つのトークンが加えられたか)と共に中間ファイル
に格納される。また、第2パス中では、状態スタックは
問題とされない。これは、その状態が中間ファイル中で
線形順になるからである。しかし、状態情報と共に保持
されたトークンのカウントが与えられた場合にはトーク
ンスタックは維持される。従って、第2パスでは状態ス
タックは修正されず、トークンスタックのみが加えられ
る。また、両方のパスで、yyr2テーブル中の除去すべき
トークンのカウントが与えられた場合には、トークンス
タックは、プロダクションの削減によって削減される。
【0077】次いでブロック1512で、その状態に関する
ユーザ動作の有無を判定する。これは、動作を定義す
る、yyr2テーブルへの索引として、前記状態を利用する
ことにより判定される。この状態に関するyyr2テーブル
中の項目が動作の存在を示している場合には、ブロック
1512からブロック1514に移行して、ブロック1506で読み
出したデータを取得し、パス1処理におけるそのポイン
トで存在したように、パラメータのパラメータ値をセッ
トする。次いでブロック1518で、その状態について定義
されたユーザパス1またはユーザパス12動作を実行す
る。従って、パス2またはパス12として指定された全て
の動作は、この処理ポイントで実行されることになる。
ユーザ動作の実施後、ブロック1518からブロック1506に
戻って、次の状態を読み出す。
【0078】ブロック1512で、この状態に関するユーザ
動作が存在しないことを判定した場合には、ブロック15
16に移行して、構文解析ファイルからの次の状態の読み
出しに備えてyaccスタックを一掃した後、ブロック1506
に戻って次の状態を取得する。従って、上述のようにし
て、元の入力ソースファイルからのトークンの再構文解
析を必要とすることなく、2パス関数が全て達成され
る。
【0079】また、ブロック1508で、前記状態が特殊状
態であると判定した場合には、ブロック1508から図16
のブロック1602に移行する。特殊状態とは、構文解析フ
ァイルに挿入されてパス2の処理のための条件を設定す
る状態である。
【0080】ブロック1602では、その状態が状態END_OF
_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処理が再開される。
【0081】前記特殊状態が状態END_OF_DOPASS2でない
場合には、ブロック1602からブロック1608に移行して、
その状態が状態TWOPASS_CALLFUNCであるか否かを判定す
る。ユーザが2パス呼び出し関数操作を実行すると、図
19で説明するコードが実行されて、状態TWOPASS_CALL
FUNC、および、パス2中で呼び出すべき関数の名称が、
その関数を呼び出すためのパラメータと共に構文解析フ
ァイルに格納される。この状態にパス2処理中に遭遇し
た場合には、ブロック1608からブロック1610に移行して
図25の関数を呼び出して、構文解析ファイルからパラ
メータを読み出す。次いでブロック1612で、それらのパ
ラメータをメモリ中に復元し、ブロック1614で、元のtw
opass_callfuncステートメントで指定された関数を呼び
出す。その関数の実行後、制御は図15のブロック1506
に戻る。
【0082】その状態が、状態TWOPASS_CALLFUNCでない
場合には、制御がブロック1616に戻って、その状態が変
数復元状態であるか否かを判定する。それが変数復元状
態である場合には、制御がブロック1618に移行して図2
5を呼び出して、その変数に関するデータを読み出し、
次いでブロック1620で、その読み取ったデータを変数に
格納する。その変数の復元後、または、前記状態が変数
復元状態でない場合には、制御が図15のブロック1506
に戻る。
【0083】図17は、本システムのユーザが文法中の
任意のポイントで呼び出して変数のセーブおよび復元を
行うことが可能な関数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パスで呼び出される、という点に留意さ
れたい。
【0084】図18は、上述の関数twopass_restoreを
示すフローチャートである。文法内または文法外からこ
の関数を呼び出すと、ブロック1802で、そのコードがパ
ス1内にあるか否かを判定し、そのコードがパス1内に
ない場合には、単に呼び出し側のプログラムに戻ること
になる。これは、パス2中での変数の復元が、図16の
パス2の特殊状態コードで行われ、詳細には、ブロック
1618,1620で行われるからである。パス1が処理中であ
る場合には、ブロック1802からブロック1804に移行し
て、構文解析ファイルに変数復元状態を書き込み、次い
でブロック1806で、構文解析ファイルにデータタイプを
書き込む。最後に、ブロック1808で、構文解析ファイル
に実際のデータを書き込み、これが、上述のように復元
されることになる。
【0085】twopass_saveおよびtwopass_restoreは、
互いに関連のないものであり、独立した関数である。
【0086】twopass_saveは、どのパスが関連するかに
基づいて2つの異なるものをセーブする。第1パス中に
は、twopass_saveは変数の内容を中間ファイルにセーブ
する。ファイルのサイズを縮小するために、何処でまた
は如何に変数を取得したかに関するレコードがその変数
と共にファイル中に格納されることはなく、そのデータ
のみが格納されることになる。また、第2パス中には、
twopass_saveは、第1パス中で以前に格納された変数の
値を復元する。第2パスでは、中間ファイル中に存在す
るものに関する情報が必要となるが、第1パス中におけ
る同じtwopass_saveの呼び出しが第2パス中で再び実行
されるので、前記情報は暗黙的に提供され、従って、第
2パスで実行される際には、第1パスで有していた同じ
情報が全て暗黙的に備わっていることになる。
【0087】twopass_restoreは、文法外の変数に用い
られる。twopass_restoreを第2パス中の場合と全く同
様に再度実行する(これは文法外での実行が困難なもの
である)ことを要求する代わりに、第1のtwopass_rest
oreが、特殊レコードを中間ファイルに格納する。その
特殊レコードは、データと、そのデータが復元されるべ
き位置との両方を含むものである。このレコードが第2
パス中で処理される場合、そのデータは自動的に変数に
戻される。
【0088】図19は、本システムのユーザが利用可能
な関数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中で関数が呼び出されるこ
とになる。
【0089】図20は、図19の関数から呼び出される
関数yy_syncvarを示すフローチャートである。この処理
に入った後、ブロック2002で、デルタがセーブされてい
るか否か、あるいは、全変数がセーブされているか否か
を判定する。デルタは、変化が小さい場合に利用され
る。これは、小さな数づつインクリメントするのが普通
である行番号等のデータにとって極めて有用なものであ
る。構文解析ファイル中のレコードは、小さなデルタが
3ビット(最大値8まで)に納まるような態様で構成さ
れる。変化がそのスペースに納まらない場合には、新し
い値が書き込まれる。デルタは、中間ファイルのサイズ
を縮小するために用いられるが、絶対不可欠なものでは
ない。
【0090】デルタがセーブされている場合には、ブロ
ック2002からブロック2004に移行して、何れかのデータ
が変更されたか否かを判定し、変更がない場合には、単
純に呼び出し側のプログラムに戻る。また、データに変
更がある場合、またはデルタがセーブされていない場合
には、制御がブロック2006に移行して、TWOPASS_VARの
データを構文解析ファイルに書き込む。そのデータは、
図16に関連して上述した特殊状態のパス2処理中に復
元されることになる。
【0091】図21は、図14および図16から呼び出
される書込モード切換関数を示すフローチャートであ
る。同図の処理に入った後、ブロック2102で、メモリ中
のバイト書込カウンタを調べることにより、構文解析フ
ァイルに何か書き込まれたか否かを判定する。構文解析
ファイル中に何らかのデータが書き込まれている場合に
は、ブロック2102からブロック2104に移行して、構文解
析ファイルを巻戻し(rewind)、次いでブロック2106で、
バッファ書込フラグをクリアする。そのフラグのクリア
後、または、構文解析ファイルに何も書き込まれていな
い場合には、制御がブロック2108に移行して、構文解析
バッファのポインタを始端にリセットし、次いでブロッ
ク2110で、変数TWOPASS_VARの全てをセーブ領域にコピ
ーした後、呼び出し側のプログラムに戻る。
【0092】構文解析ファイル中では、不必要なI/Oを
回避するためにデータはできる限り圧縮される。また、
大きなバッファを用いて不必要なI/Oが回避される。多
くの場合、中間ファイルは、バッファサイズを超えて成
長することはないので、周辺装置に対するI/Oの必要が
回避される。また、構文解析ファイルは、逐次の読み出
しおよび書き込みしか行われず、速度を高めるために探
索は行われなない。
【0093】図22は、図15から呼び出される読出モ
ード切換関数を示すフローチャートである。同図の処理
に入った後、ブロック2202で、メモリ中のバイト書込カ
ウンタを調べることにより、構文解析ファイルに何か書
き込まれたか否かを判定する。構文解析ファイルに何か
書き込まれている場合には、ブロック2202からブロック
2206に移行して、構文解析バッファの残りのデータを構
文解析ファイルに書き込み、次いでブロック2208で構文
解析ファイルを巻戻す。次いでブロック2210で、構文解
析バッファが保持することになるのと同量のデータを構
文解析ファイルから読み出す。
【0094】また、構文解析ファイルに何も書き込まれ
ていない場合には、ブロック2202からブロック2204に移
行して、構文解析バッファのポインタをリセットし、そ
のバッファの始端を指すようにする。そのポインタのリ
セット後、またはブロック2210で構文解析バッファへの
データを読み出した後、制御がブロック2212に移行し
て、上述の書込モード切換関数により変数TWOPASS_VAR
のデータが格納されたセーブ領域からそのデータの全て
をコピーして、呼び出し側プログラムに戻る。
【0095】図23は、図14から呼び出される状態書
込関数を示すフローチャートである。同図において、ブ
ロック2301で、構文解析バッファ中のデータの有無を示
すフラグを構造yysave中にセットする。次いでブロック
2302で、その構造yysaveを構文解析ファイルに書き込
み、ブロック2303で、バッファ中のデータの有無を判定
し、バッファ中にデータが存在する場合には、ブロック
2304に移行して、そのバッファ中のデータを構文解析フ
ァイルに書き込む。
【0096】図24は、上述の多数のフローチャートか
ら呼び出される関数yywriteを示すフローチャートであ
る。同図の処理に入った後、ブロック2402で、構文解析
バッファにパラメータをコピーし、次いでブロック2404
で、構文解析バッファが満杯か否かを判定する。構文解
析バッファが満杯の場合には、ブロック2404からブロッ
ク2406に移行して、その構文解析バッファの内容を構文
解析ファイルに書き込み、次いでブロック2408で、構文
解析ファイルへのデータ書き込みがあったことを示す書
込バイトカウントをバイト書込カウンタに加える。構文
解析ファイルへのデータ書き込み後、または、バッファ
が満杯ではない場合には、図24からその呼び出し側の
プログラムに戻る。
【0097】図25は、上述のフローチャートの様々な
位置から呼び出される関数yyreadを示すフローチャート
である。同図の処理に入った後、ブロック2502で、読み
出すよう要求されたデータを構文解析バッファからパラ
メータへコピーする。次いでブロック2504で、構文解析
バッファ中にデータが残っているか否かを判定し、デー
タが残っていない場合には、ブロック2506に移行して、
構文解析ファイルからバッファデータを読み出して構文
解析バッファの再充填を行う。構文解析バッファの再充
填後、または、構文解析バッファ中に更にデータが含ま
れている場合には、図25から呼び出し側プログラムに
戻る。
【0098】図26は、2パスコンパイラで利用可能な
関数TWOPASS_SAVE_LOCを示すフローチャートである。関
数TWOPASS_STUFF_LOCと連係して利用されるこの関数に
より、ユーザは、情報をセーブし、その情報がセーブさ
れた位置よりも早期の処理位置においてパス2中でその
情報を利用できるようにすることが可能になる。関数TW
OPASS_STUFF_LOCは呼び出す必要はないが、その場合に
は、関数TWOPASS_SAVE_LOCは関数twopass_saveと同様の
働きをする。
【0099】ここで図26を参照する。同図の処理に入
った後、ブロック2602で、次の変数が格納されることに
なる構文解析バッファ中の位置を判定する。ブロック26
04で、その位置を構文解析バッファに書き込み、次いで
ブロック2606で図17(twopass_save)を呼び出して変
数をセーブする。次いでブロック2608で、その位置をユ
ーザに返す。
【0100】図27は、関数TWOPASS_STUFF_LOCを示す
フローチャートである。同図の処理に入った後、ブロッ
ク2702で、早期のTWOPASS_SAVE_LOC呼び出しからの位置
を用いて構文解析ファイルから状態を読み出す。次いで
ブロック2704で、その状態がSAVE_LOCであるか否かを判
定し、その状態がSAVE_LOCである場合には、ブロック27
06に移行して、関数TWOPASS_SAVE_LOCにより識別された
位置に新しいデータをセーブする。そのデータのセーブ
後、または、前記状態がSAVE_LOCでない場合には、制御
が呼び出しプログラムに戻る。
【0101】図28は、ユーザが利用可能な関数twopas
s_dopass2を示すフローチャートである。この関数によ
り、2パスコンパイラは、パス1の操作を中断し、ソー
スファイルに関して既に定義済みの全てのパス2操作を
実行することになる。同図の処理に入った後、ブロック
2802で、構文解析バッファを構文解析ファイルに書き込
む。次いでブロック2804で、システムスタックに現在の
パーサ状態をセーブして、パス2処理の完了後にパス1
処理を再開できるようにする。次いでブロック2806で、
特殊状態END_OF_DOPASS2を構文解析ファイルに書き込
み、図15に移行してパス2処理を開始する。図15が
特殊状態END_OF_DOPASS2に遭遇すると、パス1処理が再
開される。
【0102】以下に示すリストは、本発明の2パスコン
パイラを利用して実施されたコンパイラの一例を示すも
のである。リスト1(表1ないし表5)は入力ソースを
示し、リスト2(表6ないし表10)はそのソースに関
する中間ファイル410(図4参照)を示している。ま
た、参考資料Aは、本システムに関するユーザーズガイ
ドを含み、参考資料Bは、図10ないし図12で説明し
た字句スキャナのためのソースを含み、参考資料Cは、
図5ないし図9で説明したパーサについてのソースコー
ドを含み、参考資料Dは、図13ないし図28で説明し
た実行時間パーサについてのソースコードを含むもので
ある。
【0103】
【表1】
【0104】
【表2】
【0105】
【表3】
【0106】
【表4】
【0107】
【表5】
【0108】
【表6】
【0109】
【表7】
【0110】
【表8】
【0111】
【表9】
【0112】
【表10】
【0113】以上で、本発明に関する現時点での好適実
施例についての説明を終えるが、本発明の態様が完全に
実施されたことが理解されよう。また、当業者には明ら
かなように、本発明の思想および範囲を逸脱することの
ない本発明の構成および回路に対する多数の変更や多種
多様な実施例および用途は自明のものである。本明細書
における開示および説明は、例示を目的としたものであ
り、本発明の制限を意図したものではなく、本発明の範
囲は特許請求の範囲で好適に規定されている。
【0114】以下においては本発明の種々の構成要件の
組み合わせからなる例示的な実施態様を示す。
【0115】1.第1のコンピュータ言語を第2のコン
ピュータ言語にコンパイルするためのコンピュータ実施
方法であって、前記コンパイルが少なくとも2回のコン
パイルパスを必要とするものにおいて、前記コンピュー
タ実施方法が、前記第1のコンピュータ言語を前記第2
のコンピュータ言語にコンパイルするためのパーサ状態
の複数の定義を含むと共に、前記パーサ状態の少なくと
も1つにおいて実施するための少なくとも1つのプロダ
クション関数を含むコンパイラ定義ファイルを読み出す
ステップと、及び前記コンパイラ定義ファイルを処理し
て前記第1のコンピュータ言語をコンパイルし、前記第
2のコンピュータ言語を生成するステップとからなり、
この生成ステップが、前記第1のコンピュータ言語のス
テートメントを含むソースファイルを読み出し、前記ソ
ースファイルの前記ステートメントの各々に含まれてい
る各々の記号毎に1つ宛の、複数のトークンを生成する
ステップと、前記トークンを構文解析して、前記トーク
ンについて前記複数のパーサ状態の何れを実施すべきか
を決定し、前記構文解析によって前記パーサ状態の各々
を実施する順序を規定するステップと、前記複数のパー
サ状態の各々の実施時に、実行に備えて識別された前記
プロダクション関数を全て実行するステップと、及び前
記パーサ状態をデータ記憶領域へと前記実施順に書き込
むステップとからなる第1のコンパイルパスを実行する
ステップと、前記データ記憶領域から前記パーサ状態を
前記実施順に検索するステップと、及び前記パーサ状態
の各々の実施時に、実行に備えて識別された前記プロダ
クション関数を全て実行し、前記プロダクション関数に
よって前記第2のコンピュータ言語を生成するステップ
とからなる第2のコンパイルパスを実施するステップと
からなり、前記第1と第2のコンパイルパスの両方を実
施するために前記ソースファイルが1回だけ処理され
る、コンピュータ実施方法。
【0116】2.前記プロダクション関数の各々が、前
記第1のコンパイルパス時の実行に備えて識別され、又
は前記第2のコンパイルパス時の実行に備えて識別さ
れ、或いは前記第1のコンパイルパスと前記第2のコン
パイルパスの両方における実行に備えて識別される、上
記1のコンピュータ実施方法。
【0117】3.前記第1のコンパイルパス時に実行さ
れる前記プロダクション関数の少なくとも1つの実行時
にデータをセーブするステップと、前記第2のコンパイ
ルパス時の前記プロダクション関数の実行時に前記セー
ブされたデータを復元するステップとをさらに含み、前
記データのセーブ及び復元が、前記各パス時に前記パー
サ状態を実施する前記順序において同じ位置で行われ
る、上記1のコンピュータ実施方法。
【0118】4.前記データの前記セーブ及び復元が、
前記パーサ状態の各々の実施の間に行われる、上記3の
コンピュータ実施方法。
【0119】5.前記データの前記セーブ及び復元が、
前記コンパイルパスの各々において所定のプロダクショ
ン関数が実行される際に行われる、上記3のコンピュー
タ実施方法。
【0120】6.前記第2のコンパイルパスにおける実
行に備えて、前記第1のコンパイルパスにおいて少なく
とも1つの関数を識別するステップをさらに含む、上記
3のコンピュータ実施方法。
【0121】7.前記第1のコンパイルパス時に前記少
なくとも1つの関数に受け渡すべきデータをセーブし、
前記第2のコンパイルパスにおいて前記少なくとも1つ
の関数を実行する際に、前記少なくとも1つの関数に前
記データを受け渡すステップをさらに含む、上記6のコ
ンピュータ実施方法。
【0122】8.前記第1のコンパイルパス時に所定の
プロダクション関数を実行する場合に、前記第1のコン
パイルパスの処理を中断し、前記第2のコンパイルパス
を実施して前記データ記憶領域に記憶された前記パーサ
状態の全てを前記第2のコンパイルパスで処理し、前記
第1のパスの処理を再開するステップをさらに含む、上
記1のコンピュータ実施方法。
【0123】9.前記第1のコンパイルパス時に実行さ
れる前記プロダクション関数の少なくとも1つの実行時
にデータをセーブし、前記第2のコンパイルパス時にお
ける前記プロダクション関数の実行時に前記セーブされ
たデータを復元するステップをさらに含み、前記データ
が、前記第1のコンパイルパスにおいて前記パーサ状態
を実施する前記順序中の第1の位置にセーブされ、前記
第2のコンパイルパスにおいて前記パーサ状態を実施す
る前記順序中の先行位置で復元される、上記1のコンピ
ュータ実施方法。
【0124】10.第1の所定のプロダクション関数が
前記第1のコンパイルパスにおいて実行される際に前記
セーブ位置が識別され、第2の所定のプロダクション関
数が前記第1のコンパイルパスにおいて実行される際に
前記データがセーブされる、上記9のコンピュータ実施
方法。
【0125】11.第1のコンピュータ言語を第2のコ
ンピュータ言語にコンパイルするためのコンピュータ実
施方法であって、前記コンパイルが少なくとも2回のコ
ンパイルパスを必要とするものにおいて、前記コンピュ
ータ実施方法が、前記第1のコンピュータ言語を前記第
2のコンピュータ言語にコンパイルするためのパーサ状
態の複数の定義を含むコンパイラ定義ファイルを読み出
し、前記コンパイラ定義ファイルが前記パーサ状態の少
なくとも1つにおいて実施するための少なくとも1つの
プロダクション関数を含み、また前記少なくとも1つの
プロダクション関数の各々が前記第1のコンパイルパス
時の実行に備えて識別され、又は前記第2のコンパイル
パス時の実行に備えて識別され、或いは前記第1のコン
パイルパスと前記第2のコンパイルパスの両方における
実行に備えて識別されるステップと、及び前記コンパイ
ラ定義ファイルを処理して前記第1のコンピュータ言語
をコンパイルし、前記第2のコンピュータ言語を生成す
るステップとからなり、この生成ステップが、前記第1
のコンピュータ言語のステートメントを含むソースファ
イルを読み出し、前記ソースファイルの前記ステートメ
ントの各々に含まれている各々の記号毎に1つ宛の、複
数のトークンを生成するステップと、前記トークンを構
文解析して、前記トークンについて前記複数のパーサ状
態の何れを実施すべきかを決定し、前記構文解析によっ
て前記パーサ状態の各々を実施する順序を規定するステ
ップと、前記複数のパーサ状態の各々の実施時に前記第
1のコンパイルパスにおいて実行に備えて識別された前
記プロダクション関数を全て実行し、前記複数のパーサ
状態の各々の実施時に前記両方のコンパイルパスにおい
て実行に備えて識別された前記プロダクション関数を全
て実行するステップと、及び前記パーサ状態をデータ記
憶領域へと前記実施順に書き込むステップとからなる前
記第1のコンパイルパスを実行するステップと、前記デ
ータ記憶領域から前記パーサ状態を前記実施順に検索す
るステップと、及び前記パーサ状態の各々の実施時に前
記第2のコンパイルパスにおいて実行に備えて識別され
た前記プロダクション関数を全て実行し、前記パーサ状
態の各々の実施時に前記両方のコンパイルパスにおいて
実行に備えて識別された前記プロダクション関数を全て
実行し、前記プロダクション関数によって前記第2のコ
ンピュータ言語を生成するステップとからなる第2のコ
ンパイルパスを実施するステップとからなり、前記第1
と第2のコンパイルパスの両方を実施するために前記ソ
ースファイルが1回だけ処理される、コンピュータ実施
方法。
【0126】12.前記第1のコンパイルパス時に実行
される前記プロダクション関数の少なくとも1つの実行
時にデータをセーブするステップと、前記第2のコンパ
イルパス時の前記プロダクション関数の実行時に前記セ
ーブされたデータを復元するステップとをさらに含み、
前記データのセーブ及び復元が、前記各パス時に前記パ
ーサ状態を実施する前記順序において同じ位置で行われ
る、上記11のコンピュータ実施方法。
【0127】13.前記データの前記セーブ及び復元
が、前記パーサ状態の各々の実施の間に行われる、上記
12のコンピュータ実施方法。
【0128】14.前記データの前記セーブ及び復元
が、前記コンパイルパスの各々において所定のプロダク
ション関数が実行される際に行われる、上記12のコン
ピュータ実施方法。
【0129】15.前記第2のコンパイルパスにおける
実行に備えて、前記第1のコンパイルパスにおいて少な
くとも1つの関数を識別するステップをさらに含む、上
記11のコンピュータ実施方法。
【0130】16.前記第1のコンパイルパス時に前記
少なくとも1つの関数に受け渡すべきデータをセーブ
し、前記第2のコンパイルパスにおいて前記少なくとも
1つのプロダクション関数を実行する際に、前記少なく
とも1つのプロダクション関数に前記データを受け渡す
ステップをさらに含む、上記15のコンピュータ実施方
法。
【0131】17.前記第1のコンパイルパス時に所定
のプロダクション関数を実行する場合に、前記第1のコ
ンパイルパスの処理を中断し、前記第2のコンパイルパ
スを実施して前記データ記憶領域に記憶された前記パー
サ状態の全てを前記第2のコンパイルパスで処理し、前
記第1のパスの処理を再開するステップをさらに含む、
上記11のコンピュータ実施方法。
【0132】18.前記第1のコンパイルパス時に実行
される前記プロダクション関数の少なくとも1つの実行
時にデータをセーブし、前記第2のコンパイルパス時に
おける前記プロダクション関数の実行時に前記セーブさ
れたデータを復元するステップをさらに含み、前記デー
タが、前記第1のコンパイルパスにおいて前記パーサ状
態を実施する前記順序中の第1の位置にセーブされ、前
記第2のコンパイルパスにおいて前記パーサ状態を実施
する前記順序中の先行位置で復元される、上記11のコ
ンピュータ実施方法。
【0133】19.第1の所定のプロダクション関数が
前記第1のコンパイルパスにおいて実行される際に前記
セーブ位置が識別され、第2の所定のプロダクション関
数が前記第1のコンパイルパスにおいて実行される際に
前記データがセーブされる、上記18のコンピュータ実
施方法。
【0134】20.第1のコンピュータ言語を第2のコ
ンピュータ言語にコンパイルするためのコンピュータ実
施方法であって、前記コンパイルが少なくとも2回のコ
ンパイルパスを必要とするものにおいて、前記コンピュ
ータ実施方法が、前記第1のコンピュータ言語を前記第
2のコンピュータ言語にコンパイルするためのパーサ状
態の複数の定義を含むと共に、前記パーサ状態の少なく
とも1つにおいて実施するための少なくとも1つのプロ
ダクション関数を含むコンパイラ定義ファイルを読み出
すステップと、及び前記コンパイラ定義ファイルを処理
して前記第1のコンピュータ言語をコンパイルし、前記
第2のコンピュータ言語を生成するステップとからな
り、この生成ステップが、前記第1のコンピュータ言語
のステートメントを含むソースファイルを読み出し、前
記ソースファイルの前記ステートメントの各々に含まれ
ている各々の記号毎に1つ宛の、複数のトークンを生成
するステップと、前記トークンを構文解析して、前記ト
ークンについて前記複数のパーサ状態の何れを実施すべ
きかを決定し、前記構文解析によって前記パーサ状態の
各々を実施する順序を規定するステップと、前記複数の
パーサ状態の各々の実施時に、実行に備えて識別された
前記プロダクション関数を全て実行するステップと、及
び前記パーサ状態をデータ記憶領域へと前記実施順に書
き込むステップとからなるスキャンコンパイルパスを実
行するステップと、前記データ記憶領域から前記パーサ
状態を前記実施順に検索するステップと、及び前記パー
サ状態の各々の実施時に、実行に備えて識別された前記
プロダクション関数を全て実行し、前記プロダクション
関数によって前記第2のコンピュータ言語を生成するス
テップとからなる前記スキャンコンパイルパスに後続す
る少なくとも1つのパスを実施するステップとからな
り、前記スキャンコンパイルパスと前記スキャンコンパ
イルパスに後続する少なくとも1つのパスの両方を実施
するために前記ソースファイルが1回だけ処理される、
コンピュータ実施方法。
【0135】21.前記プロダクション関数の各々が、
前記スキャンコンパイルパス時の実行に備えて識別さ
れ、又は前記スキャンコンパイルパスに後続する少なく
とも1つのパス時の実行に備えて識別され、或いは前記
スキャンコンパイルパスと前記スキャンコンパイルパス
に後続する少なくとも1つのパスにおける実行に備えて
識別される、上記20のコンピュータ実施方法。
【0136】22.前記スキャンコンパイルパス時に実
行される前記プロダクション関数の少なくとも1つの実
行時にデータをセーブするステップと、前記スキャンコ
ンパイルパスに後続する少なくとも1つのパス時の前記
プロダクション関数の実行時に前記セーブされたデータ
を復元するステップとをさらに含み、前記データのセー
ブ及び復元が、前記スキャンコンパイルパスに後続する
前記パスの各々において前記パーサ状態を実施する前記
順序でもって同じ位置で行われる、上記20のコンピュ
ータ実施方法。
【0137】23.前記データの前記セーブ及び復元
が、前記パーサ状態の各々の実施の間に行われる、上記
22のコンピュータ実施方法。
【0138】24.前記データの前記セーブ及び復元
が、前記コンパイルパスの各々において所定のプロダク
ション関数が実行される際に行われる、上記22のコン
ピュータ実施方法。
【0139】25.前記スキャンコンパイルパスに後続
する前記少なくとも1つのパスにおける実行に備えて、
前記スキャンコンパイルパスにおいて少なくとも1つの
関数を識別するステップをさらに含む、上記20のコン
ピュータ実施方法。
【0140】26.前記スキャンコンパイルパス時に前
記少なくとも1つの関数に受け渡すべきデータをセーブ
し、前記スキャンコンパイルパスに後続する前記少なく
とも1つのパスにおいて前記少なくとも1つの関数を実
行する際に、前記少なくとも1つの関数に前記データを
受け渡すステップをさらに含む、上記25のコンピュー
タ実施方法。
【0141】27.前記スキャンコンパイルパス時に所
定のプロダクション関数を実行する場合に、前記スキャ
ンコンパイルパスの処理を中断し、前記スキャンコンパ
イルパスに後続する前記少なくとも1つのパスを実施し
て前記データ記憶領域に記憶された前記パーサ状態の全
てを処理し、前記スキャンコンパイルパスの処理を再開
するステップをさらに含む、上記20のコンピュータ実
施方法。
【0142】28.前記スキャンコンパイルパス時に実
行される前記プロダクション関数の少なくとも1つの実
行時にデータをセーブし、前記スキャンコンパイルパス
に後続する前記少なくとも1つのパス時における前記プ
ロダクション関数の実行時に前記セーブされたデータを
復元するステップをさらに含み、前記データが、前記ス
キャンコンパイルパスにおいて前記パーサ状態を実施す
る前記順序中の第1の位置にセーブされ、前記スキャン
コンパイルパスに後続する前記少なくとも1つのパスに
おいて前記パーサ状態を実施する前記順序中の先行位置
で復元される、上記20のコンピュータ実施方法。
【0143】29.第1の所定のプロダクション関数が
前記スキャンコンパイルパスにおいて実行される際に前
記セーブ位置が識別され、第2の所定のプロダクション
関数が前記スキャンコンパイルパスにおいて実行される
際に前記データがセーブされる、上記28のコンピュー
タ実施方法。
【0144】
【発明の効果】本発明は上述のように構成したので、ソ
ース入力を1回しか処理しない高効率の2パス言語コン
パイラを提供することができる。
【図面の簡単な説明】
【図1】本発明を組み込んだコンピュータシステムを示
すブロック図である。
【図2】本発明の2パスコンパイラを作成するプロセス
を示すブロック図である。
【図3】2パスコンパイラの操作を示すブロック図であ
る。
【図4】図2のプリプロセッサブロックおよびポストプ
ロセッサブロックを示すブロック図である。
【図5】図4のプリプロセッサパーサを示すフローチャ
ートである。
【図6】図4のポストプロセッサパーサを示すフローチ
ャートである(1/2)。
【図7】図4のポストプロセッサパーサに関するフロー
チャートである(2/2)。
【図8】図5から呼び出される関数yyparseを示すフロ
ーチャートである(1/2)。
【図9】図5から呼び出される関数yyparseを示すフロ
ーチャートである(2/2)。
【図10】図4のプリ/ポストプロセッサスキャナを示
すフローチャートである(1/3)。
【図11】図4のプリ/ポストプロセッサスキャナを示
すフローチャートである(2/3)。
【図12】図4のプリ/ポストプロセッサスキャナを示
すフローチャートである(3/3)。
【図13】図2の2パスコンパイラ126の動作を示すブ
ロック図である。
【図14】図2の2パスコンパイラ126のためのパーサ
を示すフローチャートである(1/3)。
【図15】図2の2パスコンパイラ126のためのパーサ
を示すフローチャートである(2/3)。
【図16】図2の2パスコンパイラ126のためのパーサ
を示すフローチャートである(3/3)。
【図17】2パスコンパイラで用いるための利用可能な
関数twopass_saveを示すフローチャートである。
【図18】2パスコンパイラで用いるための利用可能な
関数twopass_restoreを示すフローチャートである。
【図19】2パスコンパイラで用いるための利用可能な
関数twopass_callfuncを示すフローチャートである。
【図20】図19から呼び出される関数yy_syncvarを示
すフローチャートである。
【図21】図14および図16から呼び出される書込モ
ード切換関数を示すフローチャートである。
【図22】図15から呼び出される読出モード切換関数
を示すフローチャートである。
【図23】図14から呼び出される状態書込関数を示す
フローチャートである。
【図24】図23から呼び出される関数yywriteを示す
フローチャートである。
【図25】図15および図16から呼び出される関数yy
readを示すフローチャートである。
【図26】2パスコンパイラで利用可能な関数twopass_
save_locを示すフローチャートである。
【図27】2パスコンパイラで利用可能な関数twopass_
stuff_locを示すフローチャートである。
【図28】2パスコンパイラで利用可能な関数twopass_
dopass2を示すフローチャートである。
【符号の説明】
126 2パスコンパイラ 302 ソースコードファイル 304 字句スキャナ 306 第1パスパーサ 308 第2パスパーサ 310 パーサ動作関数 312 中間ファイル

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】第1のコンピュータ言語を第2のコンピュ
    ータ言語にコンパイルするためのコンピュータ実施方法
    であって、前記コンパイルが少なくとも2回のコンパイ
    ルパスを必要とするものにおいて、前記コンピュータ実
    施方法が、 前記第1のコンピュータ言語を前記第2のコンピュータ
    言語にコンパイルするためのパーサ状態の複数の定義を
    含むと共に、前記パーサ状態の少なくとも1つにおいて
    実施するための少なくとも1つのプロダクション関数を
    含むコンパイラ定義ファイルを読み出すステップと、及
    び前記コンパイラ定義ファイルを処理して前記第1のコ
    ンピュータ言語をコンパイルし、前記第2のコンピュー
    タ言語を生成するステップとからなり、この生成ステッ
    プが、 前記第1のコンピュータ言語のステートメントを含むソ
    ースファイルを読み出し、前記ソースファイルの前記ス
    テートメントの各々に含まれている各々の記号毎に1つ
    宛の、複数のトークンを生成するステップと、 前記トークンを構文解析して、前記トークンについて前
    記複数のパーサ状態の何れを実施すべきかを決定し、前
    記構文解析によって前記パーサ状態の各々を実施する順
    序を規定するステップと、 前記複数のパーサ状態の各々の実施時に、実行に備えて
    識別された前記プロダクション関数を全て実行するステ
    ップと、及び前記パーサ状態をデータ記憶領域へと前記
    実施順に書き込むステップとからなる第1のコンパイル
    パスを実行するステップと、 前記データ記憶領域から前記パーサ状態を前記実施順に
    検索するステップと、及び前記パーサ状態の各々の実施
    時に、実行に備えて識別された前記プロダクション関数
    を全て実行し、前記プロダクション関数によって前記第
    2のコンピュータ言語を生成するステップとからなる第
    2のコンパイルパスを実施するステップとからなり、 前記第1と第2のコンパイルパスの両方を実施するため
    に前記ソースファイルが1回だけ処理される、コンピュ
    ータ実施方法。
JP10986494A 1993-05-24 1994-05-24 2パスコンパイラのための改良された方法 Expired - Fee Related JP3648268B2 (ja)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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

Cited By (1)

* Cited by examiner, † Cited by third party
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