STFE(3) — NEWS-OS Programmer’s Manual
名称
stfe − シンボルテーブルへのアクセスおよび追加に必要とされる基本関数との 高水準インタフェースを提供するルーチン
形式
#include <syms.h>
long st_filebegin (filename, lang, merge, glevel)
char ∗filename;
long lang;
long merge;
long glevel;
long st_endallfiles ()
long st_fileend (idn)
long idn;
long st_blockbegin(iss, value, sc)
long iss;
long value;
long sc;
long st_textblock()
long st_blockend(size)
long size;
long st_procend(idn)
long idn
long st_procbegin (idn)
long idn;
char ∗st_str_idn (idn)
long idn;
char ∗st_sym_idn (idn, value, sc, st, index)
long idn;
long ∗value;
long ∗sc;
long ∗st;
long ∗index;
long st_abs_ifd_index (ifd, index)
long ifd;
long index;
long st_fglobal_idn (idn)
long idn;
pSYMR st_psym_idn_offset (idn, offset)
long idn;
long offset;
long st_pdadd_idn (idn)
long idn;
解説
stfe ルーチンは、コンパイラのフロントエンドの共通な要求に基づくシンボル テーブルとの高水準インタフェースを提供します。
st_filebegin
フロントエンド中の各 cpp 指示語に出会ったときに呼び出されます。 これは、st_fileadd を呼び出し、シンボルを追加し、適切なオープン ファイルを見つけるか、新しいファイルを作成します。 これは、ファイル名、言語定数(symconst.h 参照)、マージフラグ(0 または 1)および −g レベルの定数(symconst.h 参照)を引数として とります。 これは、行番号指示語で使用するファイルシンボルを指しているdense 番号を 返します。
st_fileend
該当するファイルに対応する st_filebegin コールからの dense 番号から、 エンドシンボルを生成し、開始ファイルのインデックスフィールド、 エンドファイルを超えたファイルポイントのインデックスフィールドを指す ようにその参照をパッチします。 エンドファイルは開始ファイルを指します。
st_endallfiles
実行の終わりで呼び出され、st_filebegin への呼び出しで終了していない すべてのファイルをクローズします。 CPP 指示語は、オリジナルソースファイルへのリターンを反映しないので、 このルーチンは、たくさんのファイルをクローズできるでしょう。
st_blockbegin
構造体とユニオンで始まる両方の言語ブロック(たとえば、C の左側の 中カッコブロック)をサポートします。 記憶クラスが scText の場合は、構造体で始まる言語ブロックで、scInfo の 場合は、ユニオンで始まる言語ブロックです。 iss (文字列スペースへのインデックス)は、もしあるならば、構造体等の 名前を示します。
記憶クラスが scText の場合、st_blockbegin の結果をチェックし なければなりません。 これは、外部ブロックに対しては dense 番号、そしてネストされたブロックに 対しては 0 を返します。 0 でないブロック番号は、BGNB ucode で使用すべきです。 さまざまな宣言を提供するネストされたブロックなしの言語のユーザは、 この段落の残りは必要ありません。 ネストされたブロックは 2 段階式になっています。 1 つの段階は、言語ブロックを検出したときに生じ、もう 1 つは、 ブロックが内容をもっていることを知ったときに生じます。 ブロックが内容をもっている場合(たとえば、ローカル変数)、 フロントエンドは、 st_textblock を呼び出し、ブロックの BGNB ucode に対するゼロでない dense 番号を得なけれ ばなりません。 ブロックが空で、st_textblock が呼び出されない場合は、 そのブロックの st_blockbegin および st_blockend は、 ブロックおよびエンドシンボルを生成しません。
記憶クラスが scInfo の場合、st_blockbegin は、シンボルテーブルに 開始ブロックシンボルを作成し、それを参照する dense 番号を返します。 dense 番号は、構造体等を参照するのに必要な補助を構築するために必要です。 これは、ファイルインデックスとともに、aux 中の TIR の後に加えられています。 この dense 番号は、st_blockend により使用されるブロックのスタック にも記憶されています。
st_blockbegin は、フロントエンドがデバッギングシンボルを生成しない場合、 言語ブロックに対しては呼び出されてはなりません。
st_blockend は、ブロックがネストする場合に必要とします。 これは、最も最近開始されたブロックに対する dense 番号を検索し、 対応するエンドシンボルを作成します。 fileend のように、開始および終了シンボルのインデックスフィールドは 両方とも、他の終了のシンボルを指します。 シンボルが開始シンボルの記憶クラスにより決定されたような構造体等を終了 する場合は、size パラメタが開始シンボルの値フィールドに割り当てられます。 通常これは構造体のサイズかまたは enum の最大値です。 この時点でしかそれを知ることはできません。 エンドシンボルの dense 番号は返されるので、ucode ENDB はそれを使用する ことができます。 それが無視されたテキストブロックの場合は、dense 番号は 0 で、 ENDB は生成されません。
通常、定義された外部プロシージャまたは関数は、シンボルテーブルおよび 外部テーブルに現れます。 外部テーブルの定義は、最初 st_extadd の使用を介して行わなければ なりません。 この定義の後、 st_procbegin は、プロシージャに対する外部シンボルを指す dense 番号とともに呼び出す ことができます。 これは、定義されたプロシージャをもっているか否かをチェックします (記憶クラスをチェックすることにより)。 これは、プロシージャシンボルをシンボルテーブルに追加します。 外部シンボルのインデックスは、その補助データタイプの情報 (デバッギングがオフの場合は indexNil)を指さなければなりません。 このインデックスは正規のシンボルのインデックスフィールドにコピーされ、 その型のコピーが作られます(外部シンボルが正規のシンボルと違うファイルに ある場合)。 次に、シンボルに対するインデックスを、外部シンボルのインデックス フィールドに入れます。 外部シンボルの dense 番号はそれを指す ucode 中のブロック番号として使用され、 これを使用して、st_pdadd_idn にある場合、プロシージャを付加します。
st_procend
エンドシンボルを作成し、そのインデックスを blockend および fileend にあるように固定しますが、エンドプロシージャの リファレンスはインデックスフィールドではなく開始プロシージャの aux に 保持されることは除きます(なぜならば、開始プロシージャは、エンド リファレンスと同じくタイプをもっているので)。 これは引数として、プロシージャの外部シンボルの dense 番号とともに呼び出し、 END ucode で使用されるエンドシンボルの dense 番号を返さなければなりません。
st_str_idn
dense 番号引数により参照されるシンボルまたは外部シンボルと対応付けられて いる文字列を返します。 シンボルに特色がない場合(たとえば、シンボルが何もない)は、−1 という値 または (char ∗) が返されます。
st_sym_idn
st_str_idn と同じ結果を返します。 さらに idn により指定されたシンボルの残りのフィールドは、引数に返します。
st_fglobal_idn
指定された idn と対応付けられているシンボルが静的でない場合、 1 を返し、 そうでない場合は 0 を返します。
st_abs_ifd_index
dense 番号に対する絶対的なオフセットを返します。 シンボルがグローバルの場合、そのグローバルシンボルのインデックスが返されます。 シンボルがファイル内に生じた場合、そのファイルの前に発生したファイル中の すべてのシンボルの合計、およびそのファイル内のシンボルのインデックスが 返されます。
st_pdadd_idn
エントリを、procbegin により生成された st_proc entry に対する プロシージャテーブルに付加します。 これは、フロントエンドが該当するプロシージャに対するコードを作成する場合、 呼び出されなければなりません。
著者
Mark I. Himelstein
関連事項
NEWS-OSRelease 4.2.1R