(57)【特許請求の範囲】
【請求項１】
コンピュータプログラムの実行コードを生成するためのコンピュータシステムで実行される方法であって、前記コンピュータシステムが、
中央処理ユニットと、
入力装置及び出力装置と、
前記中央処理ユニットで実行されるコンピュータプログラムにより以下の処理が行われるよう前記コンピュータシステムに指令する、前記コンピュータプログラムを記憶したコンピュータメモリとを備え、
前記コンピュータシステムは、前記コンピュータプログラムの実行によって、
複数のノードを持つプログラムツリーであって、各ノードが、前記コンピュータプログラムのプログラミング構造に対応している前記プログラムツリーの情報を前記コンピュータメモリにロードし、前記出力装置にツリー表示する処理を行い、
ツリー表示された前記プログラミング構造に対応する各ノードについて、表現又は宣言ツリーエレメントを表すため各ノードに定義された演算子又はオペランドの情報を基に、演算子オペレータ、定数、流れ制御、割当演算子、又はタイプ定義を含む１以上のノードを、複数のディスプレイリスト項目を有するディスプレイリストに変換する処理（以下、「インプリメンテーション処理」と称する。）を行い、
前記プログラムツリーの各ノードについて、前記各ディスプレイリスト項目にリンクづけされたストリングテーブルの各データから実行可能なコードを生成する処理を行ない、
前記インプリメンテーション処理のために、プログラミング言語構文とは独立したコマンド、すなわち、前記プログラムツリーにノードを追加すること、前記プログラムツリーからノードを削除すること、そして、前記プログラムツリーにおけるノードの挿入点を変更することを含むユーザからの前記コマンドを前記入力装置を介して受信する処理を行なうことを含む前記方法。
【請求項２】
コンピュータプログラムの実行コードを生成するためのコンピュータシステムで実行される方法であって、前記コンピュータシステムが、
中央処理ユニットと、
入力／出力装置と、
前記中央処理ユニットで実行されるコンピュータプログラムにより以下の処理が行われるよう前記コンピュータシステムに指令する、前記コンピュータプログラムを記憶したコンピュータメモリとを備え、
前記コンピュータプログラムの実行によって、
複数のノードを持つプログラムツリーであって、各ノードが、前記コンピュータプログラムのプログラミング構造に対応している前記プログラムツリーの情報を前記コンピュータメモリにロードし、前記出力装置にツリー表示する処理が行われ、
ツリー表示された前記プログラミング構造に対応する各ノードについて、表現又は宣言ツリーエレメントを表すため各ノードに定義された演算子又はオペランドの情報を基に、演算子オペレータ、定数、流れ制御、割当演算子、又はタイプ定義を含む１以上のノードを、複数のディスプレイリスト項目を有するディスプレイリストに変換する処理（以下、「インプリメンテーション処理」と称する。）が行われ、
前記プログラムツリーの各ノードについて、前記各ディスプレイリスト項目にリンクづけされたストリングテーブルの各データに基づき実行可能なコードを生成する処理が行われ、
ツリー表示された前記プログラムツリーの各ノードが、ツリー表示された前記プログラミング構造をインプリメンテーションするための機能を有し、そして、前記インプリメンテーション処理において、前記各ノードが有するこのインプリメンテーションするための機能が呼び出されて、各ノードがディスプレイリストに変換される、前記方法。
【請求項３】
コンピュータプログラムの実行コードを生成するためのコンピュータシステムで実行される方法であって、前記コンピュータシステムが、
中央処理ユニットと、
入力／出力装置と、
前記中央処理ユニットで実行されるコンピュータプログラムにより以下の処理が行われるよう前記コンピュータシステムに指令する、前記コンピュータプログラムを記憶したコンピュータメモリとを備え、
前記コンピュータシステムは、前記コンピュータプログラムの実行によって、
複数のノードを持つプログラムツリーであって、各ノードが、前記コンピュータプログラムのプログラミング構造に対応している前記プログラムツリーの情報を前記コンピュータメモリにロードし、前記出力装置にツリー表示する処理を行い、
ツリー表示された前記プログラミング構造に対応する各ノードについて、表現又は宣言ツリーエレメントを表すため各ノードに定義された演算子又はオペランドの情報を基に、演算子オペレータ、定数、流れ制御、割当演算子、又はタイプ定義を含む１以上のノードを、複数のディスプレイリスト項目を有するディスプレイリストに変換する処理（以下、「インプリメンテーション処理」と称する。）を行い、
前記プログラムツリーの各ノードについて、前記各ディスプレイリスト項目にリンクづけされたストリングテーブルの各データから実行可能なコードを生成する処理を行い、
ツリー表示された前記プログラムツリーの各ノードが、前記プログラミング構造を表すノード描写を表示するための機能を有し、ノードであるツリー要素のタイプに応じた表示の生成が前記プログラムツリーにおける表現をあらわすとき、宣言ノードによって記述された演算子又はオペランドを表示するための機能が呼び出されることを特徴とする、前記方法。
【請求項４】
コンピュータプログラムの実行コードを生成するためのコンピュータシステムで実行される方法であって、前記コンピュータシステムが、
中央処理ユニットと、
入力／出力装置と、
前記中央処理ユニットで実行されるコンピュータプログラムにより以下の処理が行われるよう前記コンピュータシステムに指令する、前記コンピュータプログラムを記憶したコンピュータメモリとを備え、
前記コンピュータシステムは、前記コンピュータプログラムの実行によって、
複数のノードを持つプログラムツリーであって、各ノードが、前記コンピュータプログラムのプログラミング構造に対応している前記プログラムツリーの情報を前記コンピュータメモリにロードし、前記出力装置にツリー表示する処理と、
ツリー表示された前記プログラミング構造に対応する各ノードについて、表現又は宣言ツリーエレメントを表すため各ノードに定義された演算子又はオペランドの識別を基に、演算子オペレータ、流れ制御、割当演算子、又はタイプ定義を含む１以上のノードを、複数のディスプレイリスト項目を有するディスプレイリストに変換する処理（以下、「インプリメンテーション処理」と称する。）とが行なわれ、そして、
前記プログラムツリーの各ノードについて、前記各ディスプレイリスト項目にリンクづけされたストリングテーブルの各データから、実行可能なコードを生成する処理が行われることを更に含む、前記方法。
【請求項５】
コンピュータプログラムの実行コードを生成するコンピュータシステムであって、
中央処理ユニットと、
入力装置と、
出力装置と、
前記コンピュータプログラムの実行コードを生成するために必要なソフトウェアコンポーネントとを記憶するためのコンピュータメモリと、
前記コンピュータシステム上で実行可能な機械命令を生成するコード生成器とを備え、
前記中央処理ユニット内のエディタ機能は、ユーザが、前記入力装置を介して、ノードをもつプログラムツリーとして前記コンピュータメモリに記憶されているプログラムを編集するためのグラフィカルユーザインタフェースを提供し、
前記中央処理ユニットは、表現又は宣言ツリーエレメントを表すため各ノードに定義された演算子又はオペランドの情報を基に、演算子オペレータ、定数、流れ制御、割当演算子、又はタイプ定義を含む１以上のノードを、複数のディスプレイリスト項目を有するディスプレイリストに変換する処理（以下、「インプリメンテーション処理」と称する。）を実行し、
前記コード生成器は、前記各ディスプレイリスト項目にリンクづけされたストリングテーブルの各データから前記インプリメンテーション処理後の各ノードを変換して実行可能なコードを生成する、ことを特徴とするコンピュータシステム。
【請求項６】
前記プログラムツリーはツリーデータ構造であって、このツリーデータ構造のノードが前記コンピュータプログラムを形成するプログラミング構造に対応している、請求項５に記載のコンピュータシステム。
【請求項７】
前記プログラムツリーはツリーデータ構造であって、このツリーデータ構造のノードが、前記コンピュータプログラムを形成し、且つ、演算子オペレータ、定数、流れ制御、割当演算子、又はタイプ定義を含むプログラミング構造に対応している、請求項５に記載のコンピュータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般に、コンピュータプログラムを発生するコンピュータ方法及びシステムに係り、より詳細には、プログラムツリーを編集するコンピュータ方法及びシステムに係る。
【背景技術】
【０００２】
コンピュータプログラムは、通常、高レベルのプログラミング言語（例えば、パスカル及びＣ）で書かれる。次いで、コンパイラーを用いて、高レベルプログラミング言語の命令をマシン命令に変換し、コンピュータによって実行できるようにする。コンパイルプロセスは、一般に、次の６段階に分けられる。
１．語彙解析
２．構文解析
３．意味解析
４．中間コード発生
５．コード最適化
６．最終コード発生
語彙解析は、コンピュータプログラムを走査し、そして高レベル言語のコンポーネント又はトークンを確認することを伴う。この段階中に、コンパイラーは、コンピュータプログラムを一連のトークンに変換し、これが構文解析中に処理される。例えば、語彙解析の間に、コンパイラーは、次のステートメント
ｃＴａｂｌｅ＝１．０；
を変数（ｃＴａｂｌｅ）、演算子（＝）、定数（１．０）及びセミコロンとして確認する。変数、演算子、定数及びセミコロンは、高レベル言語のトークンである。構文解析中に、コンパイラーはトークンを処理し、そしてプログラムを表す構文ツリーを発生する。構文ツリーは、演算子が非リーフノードに記憶されそしてオペランドがリーフノードに記憶されたツリー構造である。上記の例では、演算子（＝）は、２つのオペランド、即ち変数（ｃＴａｂｌｅ）と定数（１．０）を有する。意味解析中に、コンパイラーは、意味の正しさを確保するように構文ツリーを変更する。例えば、変数（ｃＴａｂｌｅ）が整数で、定数（１．０）が実数である場合は、意味解析中に、実数−整数変換が構文ツリーに加えられる。
中間コード発生、コード最適化及び最終コード発生中には、コンパイラーは、構文ツリーによって表されたプログラムを実行するためのマシン命令を発生する。
これらマシン命令は、次いで、コンピュータによって実行することができる。
【発明の開示】
【課題を解決するための手段】
【０００３】
本発明は、コンピュータプログラムを発生する方法及びシステムを提供する。好ましい実施例において、本発明は、プログラムツリーを直接操作するためのプログラムツリーエディタを提供する。プログラムツリーは、計算構造に対応する複数のノードを備えている。プログラムツリーエディタは、プログラミング言語構文とは独立したユーザからのコマンドを受け取る。又、本発明は、プログラムツリーのディスプレイ表示を発生するためのディスプレイ表示ジェネレータも提供する。このディスプレイ表示ジェネレータは、プログラムツリーからノードを検索し、そしてノードのディスプレイ表示を表示する。本発明のユーザは、表示されたディスプレイ表示に基づいてプログラムツリーエディタと対話するのが好ましい。
【発明を実施するための最良の形態】
【０００４】
本発明は、コンピュータプログラムを発生し維持するための方法及びシステムを提供する。好ましい実施例において、ソフトウェア機構（ファシリティ）は、コンピュータプログラムをプログラムツリーとして表す。プログラムツリーは、非リーフノードが演算子を表し、リーフノードがオペランドを表すツリー構造である。ファシリティは、ノードを直接操作するメカニズム、即ちプログラムツリー内においてノードを追加し、削除しそして移動するメカニズムを果たす。
【０００５】
ファシリティは、プログラムツリーの部分を選択し、プログラムツリーに挿入点を配置し、そして挿入点に挿入すべきノードのタイプを選択するためのコマンドを与える。ファシリティは、現在選択された部分及び現在の挿入点に対して種々のコマンドを実行できるようにする。例えば、現在選択された部分はコピーすることもできるし、或いはクリップボードに対してカットすることもできる。次いで、クリップボードの内容を、ペーストコマンドを用いてクリップボードから現在挿入点へペーストすることができる。又、ファシリティは、現在挿入点に新たにノードを挿入するための種々のコマンド（例えば、「Ｐａｓｔｅ＝」）を与える。
【０００６】
ファシリティは、好ましくは、プログラムツリーのディスプレイ表示を発生することによりプログラマにプログラムツリーを表示する。ディスプレイ表示フォーマットは、プログラムツリーに挿入できるノードの各タイプのテキスト表示を指定する。ファシリティは、好ましくは、Ｃ、パスカル、ベーシック及びリスプのような多数の異なる一般的なプログラミング言語に対しディスプレイ表示フォーマットをサポートする。これは、プログラミングツリーのディスプレイ表示を発生するためにファシリティが使用するディスプレイ表示フォーマットをプログラマがいつでも選択及び変更できるようにする。例えば、あるプログラマは、特定のプログラムツリーをＣディスプレイ表示フォーマットで見るように選択することができ、そして別のプログラマは、同じプログラムツリーをリスプのディスプレイ表示フォーマットで見るように選択することができる。又、あるプログラマは、あるプログラムツリーに対し、Ｃのディスプレイ表示フォーマットと、リスプのディスプレイ表示フォーマットとの間で切り換えを行うことができる。
【０００７】
ファシリティは、好ましくは、プログラムツリーの現在選択された部分を、プログラムツリーの対応するディスプレイ表示をハイライト処理することによりプログラマに指示する。同様に、ファシリティは、好ましくは、ディスプレイ表示内に挿入点マーク（例えば、「｜」又は「＾」）を表示することにより現在挿入点をプログラマに指示する。又、ファシリティは、プログラマが新たな現在部分を選択したり、或いはディスプレイ表示に基づいて挿入点を再位置設定したりできるようにする。
【０００８】
図１は、ファシリティが好ましく動作するところの汎用コンピュータシステムの高レベルブロック図である。コンピュータシステム１００は、中央処理ユニット（ＣＰＵ）１０１と、コンピュータメモリ（メモリ）１０２と、入力／出力装置１０３とを備えている。ファシリティのコンピュータプログラムは、メモリに存在し、ＣＰＵにおいて実行される。入力／出力装置には、ハードディスクドライブのような記憶装置１０４と、キーボード１０５と、マウスのようなポインタ装置１０６と、モニタのようなディスプレイ装置１０７とがある。
【０００９】
図２は、好ましい実施例におけるファシリティのコンポーネントのブロック図である。ファシリティ２０１は、プログラムツリーエディタ２０２と、コマンドウェルエディタ２０３と、ディスプレイ表示ジェネレータ２０４と、プログラムツリー変換器２０５と、コマンドウェル２０６と、ユーザインターフェイスマップ２０７と、プログラムツリー２０８とを備えている。プログラムツリーエディタは、使用可能なコマンドをコマンドウェルから直接又はユーザインターフェイスマップに基づいてコマンドウェルから選択するのを制御し、そしてプログラマによって選択されたコマンドの実行を行う。ユーザインターフェイスマップは、コマンドに対してメニュー項目、ツールバー及びキーをマップする。メニュー項目、ツールバー又はキーが選択されたときには、プログラムツリーエディタは、それに関連したコマンドを実行する。コマンドウェルは、プログラマの選択に使用できるコマンドと、各コマンドの実行に作用するコードとのリストを含んでいる。コマンドウェルエディタは、プログラムツリーエディタによって与えられたユーザインターフェイスをプログラマがカスタマイズできるようにする。ディスプレイ表示ジェネレータは、プログラマが選択したディスプレイ表示フォーマットに基づいてプログラムツリーのディスプレイ表示を発生し表示する。プログラムツリー変換器は、プログラムツリーを実行可能なコードに変換するのを制御する。
【００１０】
プログラムツリー
図３は、例示的なプログラムツリーを示す図である。この例示的なプログラムツリーは、次のコンピュータコードに対応する。
｛
Ｂ＝４；
Ａ＝Ｂ＋３＊（４−Ｃ）；
Ｄ＝Ａ／２；
｝
この例示的なプログラムツリーは、コンピュータコードの各ステートメントに対してノード３０２、３０３、３０４を含んでいる。ステートメント３０２及び３０４に対するサブツリーは、図３には示されていない。ステートメント「Ａ＝Ｂ＋３＊（４−Ｃ）；」に対するサブツリーは、ノード３０４ないし３１２を備えている。図４は、例示的プログラムツリーのＣディスプレイ表示を示している。図５は、例示的プログラムツリーのリスプディスプレイ表示を示している。又、例示的プログラムツリーは、図３のレイアウトと同様のツリーディスプレイ表示で示すこともできる。
【００１１】
プログラムツリーは、ツリーエレメント（ＴＥ）と称するノードの集合としてメモリに記憶されるのが好ましい。ファシリティは、２つの異なる種類のＴＥ、即ち表現（ＥＸＰＲ）及び宣言（ＤＣＬ）を維持する。各ＴＥは、次の形態を有する。即ち、（演算子、特性〔ｉ〕、オペランド〔ｉ〕）。但し、演算子及び特性は、０又はそれ以上ある。演算子フィールド及びオペランドフィールドは、他のＴＥに対するポインタである。表現は、プログラムツリーにおける表現を表す一種のＴＥである（ＥＸＰＲ  ＴＥ）。例えば、「＋」演算子に対応するＥＸＰＲ  ＴＥは、演算子を定義するＤＣＬ  ＴＥに対するポインタ（演算子）を含むと共に、各オペランドごとにＥＸＰＲ  ＴＥに対するポインタ（演算子〔ｉ〕）を含む。オペランドがプログラムツリーのリーフノードに対応する場合には、そのオペランドのＥＸＰＲ  ＴＥは、オペランドを定義する（例えば、特定の整数変数の定義）ＤＣＬ  ＴＥを指す。オペランドフィールドは、ＤＣＬ  ＴＥ又はＥＸＰＲ  ＴＥを指すことができる。例えば、図３において、ノード３０６は、メモリにおいてＥＸＰＲ  ＴＥとして表され、演算子フィールドは、「＋」演算子に対するＤＣＬ  ＴＥを指し、一方のオペランドフィールドは、「Ｂ」変数に対するＤＣＬ  ＴＥを指すＥＸＰＲ  ＴＥを指し、そして他方のオペランドフィールドは、ノード３０８に対応するＥＸＰＲ  ＴＥを指す。好ましい実施例において、プログラムツリーは、典型的な計算構造を記述するための予め定められたＤＣＬ  ＴＥを含む。典型的な計算構造は、論理及び演算の演算子、定数、流れ制御（例えば、「ｆｏｒ」構造）、割当演算子、及びタイプ定義を含む。
【００１２】
宣言(declaration) は、エンティティ（例えば、計算構造）の定義を表す一種のＴＥである（ＤＣＬ  ＴＥ）。この定義の一部は、エンティティを記述する情報、例えば、そのプリントネーム（例えば、「＋」）、それが生じるネームスペース（例えば、モジュール）、その揮発性（例えば、一定又は可変）、及び好ましくは特性として記憶される種々の他のフラグより成る。更に、宣言は、通常、１つ以上の子、即ちそのタイプ及びその初期値を有している。これらの子は、タイプ及び値を指定するＤＣＬ  ＴＥを指すことによりエンティティのタイプ及び値を定義する。ＥＸＰＲ  ＴＥは、オペランドにおける演算子のための宣言を指すので、宣言の特性を変更すると共に、プログラムツリー全体にわたってそれを直ちに反映することができる。例えば、特定の変数が強調される場合には、その変数に対する宣言の特性がハイライトにセットされる。その変数に対応する各ＥＸＰＲ  ＴＥは、その変数に対するＤＣＬ  ＴＥを指すので、プログラムツリーを処理するときに、ハイライト特性を容易にアクセスすることができる。
【００１３】
リーフノードに対応する演算子又はオペランドのための各ＥＸＰＲ  ＴＥは、ＤＣＬ  ＴＥのポインタを含んでいるので、各ＤＣＬ  ＴＥの（特性の）ネームを任意に指定することができる。これらのネームは、ディスプレイのみに使用するのが好ましい。更に、各ＤＣＬ  ＴＥは、独特なネームを必要としない。ＤＣＬ  ＴＥは、非独特なネーム及びＤＣＬ  ＴＥの他の特性によるか、或いはＤＣＬ  ＴＥの位置（例えば、モジュールのネームを含む）によってユーザに識別することができる。このように、構造のフィールドとして同じネームをもつ変数を区別することができる。又、典型的なプログラミング言語に通常関連したスコープ規定の制約なしに、オペランドを宣言に関連させることができる。例えば、ネームの競合を生じることなく、異なるライブラリーからのコードを組み合わせることができる。
【００１４】
好ましい実施例において、各ＤＣＬ  ＴＥは、宣言によって記述された演算子又はオペランドを表示するための対応するファンクション（方法）を有する。以下で詳細に述べるように、ディスプレイ表示ジェネレータは、ＥＸＰＲ  ＴＥに対応する表示を発生するときにこのファンクションを呼び出す。ＥＸＰＲ  ＴＥは、ＤＣＬ  ＴＥを指す。従って、ディスプレイ表示に影響するＤＣＬ  ＴＥの特性が変更されるときには、そのディスプレイ表示が次に発生されるときにその変更が反映される。
【００１５】
リストは、集合を表す一種のＴＥ（リストＴＥ）である。プロジェクトのモジュール、構造体のフィールド、ユニオンのフィールド、ステートメントブロックにおける宣言、手順の公式パラメータ、及び複合ステートメントにおけるステートメントをリストしたものを含む多数の種類のリストが存在する。これらのリストは、０又はそれ以上の子を有することができる。
【００１６】
特性リストは、ＴＥの種々のアトリビュートをセットするのに使用される。例えば、ＴＥは、ディスプレイ特性（例えば、色及びフォント）を指定するためのスタイル特性を含むことができる。又、これら特性は、他のＴＥから継承されてもよい。例えば、ＥＸＰＲ  ＴＥに対するスタイル特性は、演算子フィールドにより指されたＤＣＬ  ＴＥから継承されてもよい。
【００１７】
これらのポインタ相互接続は、全て、任意の複雑さのグラフを形成する。しかしながら、これらの接続が一般的なグラフを形成しても、これら接続のサブセットはプログラムツリーを形成する。更に、プログラムツリーは、プログラムツリーにおける全てのＴＥをトラバースし処理するための自然の又は規範的な順序に適したスパンツリーである。
【００１８】
プログラムツリーのルートは、リストＴＥである。ルートリストの宣言ツリーエンティティ（ＤＣＬ  ＴＥ）は、プロジェクトを構成するモジュールに対応する。プロジェクトは、コンピュータプログラムに対応する。
【００１９】
プログラムツリーエディタ
プログラムツリーエディタは、プログラムツリーを形成し変更するコマンドを与える。プログラムツリーは、ノード（３つのエレメント）を形成してプログラムツリーに挿入する一連のエディタコマンドを入力することにより発生される。例えば、プログラマは、複合ステートメントに対してあるノードを選択して、子ノードを割当演算子（＝）と共に追加すべきであることを指示することにより、複合ステートメントに割当ステートメントを追加する。
【００２０】
プログラムツリーエディタは、図４のユーザインターフェイスを与える。プログラムツリーエディタは、プログラムツリーの表示をディスプレイ装置に表示するようにディスプレイ表示ジェネレータに指令する。又、プログラムツリーエディタは、コマンドウェル、メニュー、ツールバー又はキーマップから呼び出されたコマンドの性能にも影響を与える。コマンドは、典型的に、プログラムツリーを操作し（追加及び削除ノード）、挿入点を変更し、又は現在選択を変更する。他のコマンドは、プログラムツリーを記憶及び検索できるようにする。プログラムツリーエディタのユーザインターフェイスは、図４に示すように、メニュー４０１、水平ツールバー４０２、垂直ツールバー４０３、プログラムテキストエリア４０４、及び左のマージンエリア４０５を含んでいるのが好ましい。
【００２１】
図６は、プログラムツリーエディタの選択メニューの選択を示している。選択メニューは、プログラムツリーの一部分を選択して挿入点を位置設定するための種々のコマンドをリストするプルダウンメニューである。
【００２２】
１つの実施例において、プログラムツリーエディタは、キーボード入力されたテキストを受け取り、トークンを確認し、そしてそのトークンを一連のエディタコマンドに変換するためのトークナイザ(tokenizer) を備えている。プログラムツリーエディタは、プログラムツリーの一部分を選択しそしてプログラムツリーに挿入点を位置設定するためのコマンドを与える。又、プログラムツリーエディタは、現在選択された部分及び現在の挿入点に対して種々のコマンドを実行できるようにする。例えば、「Ｐａｓｔ  ｉｆ」コマンドは、プログラムツリーの現在選択されている部分を、条件実行のための計算構造を定義するＤＣＬを指す表現ノードと置き換える。条件実行は、一般に、現在のコンピュータ言語構文において「ｉｆ」として示される。「ｉｆ」トークンをタイプすると、それに対応する「Ｐａｓｔｅ  ｉｆ」コマンドが選択に対して実行される。
【００２３】
プログラムツリーエディタは、部分を選択し、挿入点を位置設定し、プログラムツリーにおけるノードを追加及び削除し、そしてプログラムツリーを操作するための種々のコマンドを与える。上記したように、コマンドウェルエディタは、プログラマがコマンドに対するキーのマップをカスタマイズできるようにする。プログラムツリーを操作する典型的なユーザインターフェイスについて以下に説明する。
【００２４】
あるツリーノードのディスプレイ表示を指しそして左（マウスボタン）のダブルクリック動作によってあるサブツリーが選択される。そのノードをヘッドとする全サブツリーが選択される。サブツリーのリストは、マウスボタンを下に保持しながらリストを通して線を引くようにすることにより選択される。挿入点の選択及び位置設定は、単一のコマンドで行うことができる。単一のクリックはサブツリーを選択するが、そのクリックがノードのディスプレイ表示の左半分であったか右半分であったかに基づいて挿入点を選択の一端に位置設定する。サブツリーは選択されるが、サブツリーを変更することはできない。むしろ、選択は、挿入点に挿入されるべき演算子のオペランドを定義する。演算子が２進である場合には、選択されたサブツリーは、挿入点の配置に基づいて演算子の右又は左のオペランドとなる。欠落オペランドは、「？？？」と表示される。アルトクリック(atl-click) は、サブツリー全体を強調せずにサブツリーのヘッドを選択する。これは、オペランドをその位置に残したまま、演算子を置き換えられるようにする。
【００２５】
種々の選択及び挿入点位置設定コマンドについて以下に説明する。
【００２６】
ＳＥＬＥＣＴ  ＮＯＤＥ（ノードの選択）
これは、特定のノードを選択する。このコマンドを指定するために、プログラマは、表示されたプログラムのトークンの上にマウスポインタを配置しそしてマウスをクリックする。例えば、プログラマがステートメント「Ａ＝Ｂ＋３＊（４−Ｃ）」の中の「＝」を選択すると、プログラムツリーエディタは、ノード３０４を選択する。以下の説明において、プログラムツリーの選択された部分をアンダーラインで指示する。以下にノードの選択を示す。
Ａ＝Ｂ＋３＊（４−Ｃ）
マウスポインタを「＝」の上に配置する
コマンド：ノードの選択
Ａ＝Ｂ＋３＊（４−Ｃ）
【００２７】
ＳＥＬＥＣＴ  ＳＵＢＴＲＥＥ（サブツリーの選択）
これは、現在選択されているノードの全サブツリーを選択する。例えば、現在選択されている部分がノード３０４でありそしてプログラマがサブツリー選択コマンドを入力したときには、プログラムツリーエディタは、ノード３０４ないし３１２より成るサブツリーを選択する。サブツリー選択コマンドを以下に示す。
Ａ＝Ｂ＋３＊（４−Ｃ）
コマンド：サブツリー選択
Ａ＝Ｂ＋３＊（４−Ｃ）
【００２８】
ＳＥＬＥＣＴ  ＣＲＯＷＮ（クラウン選択）
これは、現在選択されているサブツリーのヘッドノードのみを選択する。例えば、現在選択されている部分がノード３０４ないし３１２をもつサブツリーでありそしてプログラマがクラウン選択コマンドを入力すると、プログラムエディタはノード３０４を選択する。サブツリーのクラウンノード選択するコマンドを以下に示す。
Ａ＝Ｂ＋３＊（４−Ｃ）
コマンド：クラウン選択
Ａ＝Ｂ＋３＊（４−Ｃ）
【００２９】
ＳＥＬＥＣＴ  ＰＡＲＥＮＴ（親の選択）
これは、現在選択されているサブツリーの親ノードのみを選択するか、或いは単一のノードのみが現在選択されている場合には、その親ノードを選択する。例えば、現在選択されている部分がノード３０４ないし３１２をもつサブツリーでありそしてプログラマが親選択コマンドを入力するときには、プログラムツリーエディタはノード３０１を選択する。ヘッドノードの親を選択するコマンドを以下に示す。
｛
Ｂ＝４
Ａ＝Ｂ＋３＊（４−Ｃ）
Ｄ＝Ａ／２
｝
コマンド：親選択
｛
Ｂ＝４
Ａ＝Ｂ＋３＊（４−Ｃ）
Ｄ＝Ａ／２
｝
【００３０】
ＳＥＬＥＣＴ  ＦＩＲＳＴ  ＣＨＩＬＤ（第１の子の選択）
これは、現在選択されているサブツリー又は現在選択されているノードのヘッドノードの第１の子ノードを選択する。例えば、現在選択されている部分がノード３０４ないし３１２をもつサブツリーでありそしてプログラマが第１の子を選択するコマンドを入力したときは、プログラムツリーエディタは、ノード３０５を選択する。第１の子を選択するコマンドを以下に示す。
Ａ＝Ｂ＋３＊（４−Ｃ）
コマンド：第１の子を選択する
Ａ＝Ｂ＋３＊（４−Ｃ）
【００３１】
ＳＥＬＥＣＴ  ＬＡＳＴ  ＣＨＩＬＤ（最後の子の選択）
これは、現在選択されているサブツリー又は現在選択されているノードのヘッドノードの最後の子ノードを選択する。例えば、現在選択されている部分がノード３０４ないし３１２をもつサブツリーでありそしてプログラマがヘッドノードの最後の子を選択するコマンドを入力したときには、プログラムツリーエディタは、ノード３０６を選択する。最後の子を選択するコマンドを以下に示す。
Ａ＝Ｂ＋３＊（４−Ｃ）
コマンド：最後の子を選択する
Ａ＝Ｂ＋３＊（４−Ｃ）
【００３２】
ＳＥＬＥＣＴ  ＰＲＥＤＥＣＥＳＳＯＲ  ＳＩＢＬＩＮＧ（祖先兄弟の選択）  これは、現在選択されているサブツリー又は現在選択されているノードのヘッドノードの祖先の兄弟を選択する。例えば、現在選択されている部分がノード３０４ないし３１２をもつサブツリーでありそしてプログラマが祖先の兄弟を選択するコマンドを入力したときには、プログラムツリーエディタは、ノード３０２を選択する。別の実施例において、サブツリーが現在選択されている場合には、プログラムツリーエディタは、祖先兄弟の全体を選択する。祖先の兄弟を選択するコマンドを以下に示す。
｛
Ｂ＝４
Ａ＝Ｂ＋３＊（４−Ｃ）
Ｄ＝Ａ／２
｝
コマンド：祖先兄弟を選択する
｛
Ｂ＝４
Ａ＝Ｂ＋３＊（４−Ｃ）
Ｄ＝Ａ／２
｝
【００３３】
ＳＥＬＥＣＴ  ＳＵＣＣＥＳＳＯＲ  ＳＩＢＬＩＮＧ（子孫兄弟の選択）
これは、現在選択されているサブツリー又は現在選択されているノードのヘッドノードの子孫の兄弟を選択する。例えば、現在選択されている部分がノード３０４ないし３１２をもつサブツリーでありそしてプログラマが子孫の兄弟を選択するコマンドを入力したときには、プログラムエディタは、ノード３０３を選択する。別の実施例において、サブツリーが現在選択されている場合には、プログラムエディタは、子孫兄弟の全体を選択する。子孫の兄弟を選択するコマンドを以下に示す。
｛
Ｂ＝４
Ａ＝Ｂ＋３＊（４−Ｃ）
Ｄ＝Ａ／２
｝
コマンド：子孫兄弟を選択する
｛
Ｂ＝４
Ａ＝Ｂ＋３＊（４−Ｃ）
Ｄ＝Ａ／２
｝
【００３４】
ＳＥＬＥＣＴ  ＮＥＸＴ「？？？」（次のノードの選択）
これは、プログラムツリーの深さ優先の左から右へのトラバースにおいて遭遇する未定義（以下で述べる）のプログラムツリーにおける次のノードを選択する。
【００３５】
ＳＥＬＥＣＴ  ＡＢＯＶＥ  ＬＥＦＴ（左の上の選択）
これは、挿入点を現在選択されているサブツリー又はノードの上に配置する。多オペランド演算子に対するノードが選択されたときには、現在選択されているノードの左に新たなオペランドノードが挿入される。コマンドは、現在選択されている部分の左へマウスポインタを配置しそしてマウスをクリックすることにより選択されるのが好ましい。例えば、現在選択されている部分がノード３０８ないし３１２をもつサブツリーでありそして挿入点が現在ノードの上で左にある場合には、プログラムエディタは、新たなノードを現在選択されているサブツリーの上でその左へ挿入する。挿入点（「｜」）を現在選択されているノードの上で左へ配置する場合を以下に述べる。
Ａ＝Ｂ＋３＊（４−Ｃ）
Ａ＝Ｂ＋｜３＊（４−Ｃ）
Ａ＝Ｂ＋Ｅ？？？３＊（４−Ｃ）
Ａ＝Ｂ＋Ｅ＋（３＊（４−Ｃ））
選択「３＊（４−Ｃ）」は、挿入される２進演算子「＋」の右のオペランドを定義することに注意されたい。かっこは、演算子の手順を示すためにディスプレイ表示ジェネレータによって表示される。
【００３６】
ＳＥＬＥＣＴ  ＡＢＯＶＥ  ＲＩＧＨＴ（右の上の選択）
これは、現在選択されているサブツリーノードの上に挿入点を配置する。多オペランドの演算子に対するノードが挿入されるときには、新たなオペランドノードは、現在選択されているノードの右に挿入される。コマンドは、現在選択されているノードの右にマウスポインタを配置しそしてマウスをクリックすることにより選択されるのが好ましい。例えば、現在選択されている部分がノード３０８ないし３１２をもつサブツリーでありそして挿入点が現在ノードの上で右にある場合には、プログラムツリーエディタは、新たなノードを現在選択されているサブツリーの上でその右へ挿入する。挿入点を現在選択されているノードの上でその右へ配置する場合を以下に示す。
Ａ＝Ｂ＋３＊（４−Ｃ）
Ａ＝Ｂ＋３＊（４−Ｃ）｜
Ａ＝Ｂ＋３＊（４−Ｃ）＋Ｅ
選択「３＊（４−Ｃ）」は、挿入された２進演算子「＋」の左のオペランドを定義することに注意されたい。
【００３７】
ＳＥＬＥＣＴ  ＢＥＦＯＲＥ  ＮＯＤＥ（ノードの前の選択）
これは、挿入点を現在選択されているノード又はサブツリーの左の兄弟として配置する。コマンドは、マウスポインタを現在選択されているサブツリーの左へ配置しそしてマウスをクリックすることにより選択されるのが好ましい。例えば、現在選択されている部分がノード３０４ないし３１２をもつサブツリーでありそしてプログラマが挿入点を左の兄弟として配置したときには、プログラムエディタは、その後にペーストされるノードをノード３０２と３０４との間に挿入する。ノードの前に選択するコマンドを以下に示す。
｛
Ｂ＝４
＞
Ａ＝Ｂ＋３＊（４−Ｃ）
Ｄ＝Ａ／２
｝
新データ：Ｃ＝２
｛
Ｂ＝４
Ｃ＝２
＞
Ａ＝Ｂ＋３＊（４−Ｃ）
Ｄ＝Ａ／２
｝
【００３８】
ＳＥＬＥＣＴ  ＡＦＴＥＲ  ＮＯＤＥ（ノードの後の選択）
これは、挿入点を現在選択されているノード又はサブツリーの右の兄弟として配置する。コマンドは、マウスポインタを現在選択されているサブツリーの右へ配置しそしてマウスをクリックすることにより入力される。例えば、現在選択されている部分がノード３０４ないし３１２をもつサブツリーでありそしてプログラマが挿入点を右の兄弟として配置したときは、プログラムツリーエディタは、その後のノードをノード３０４と３０３との間に挿入する。ノードの後に選択するコマンドを以下に示す。
｛
Ｂ＝４
Ａ＝Ｂ＋３＊（４−Ｃ）
＞
Ｄ＝Ａ／２
｝
新データ：Ｃ＝２
｛
Ｂ＝４
Ａ＝Ｂ＋３＊（４−Ｃ）
＞
Ｃ＝２
Ｄ＝Ａ／２
｝
【００３９】
ある演算子は、ある数又は最小数のオペランドを必要とする。例えば、「＋」演算子は、２つのオペランドを必要とする。「＝」演算子が入力されたときは、プログラムツリーエディタは、２つのオペランドノードをもつ「＝」ノードを形成する。オペランドがまだ指定されない場合、プログラムツリーエディタは、オペランドノードを「決定されるべき」（ＴＢＤ）にセットし、これは「未定義」とも称され、「？？？」と表示される。例えば、ステートメント「Ａ＝Ｂ＋３＊（４−Ｃ）」を入力するときには、ＴＢＤ識別子「？？？」が未定義オペランドノードを表すように表示される。ステートメントの入力を以下に示す。
Ａ＝？？？
Ａ＝Ｂ｜
Ａ＝Ｂ＋？？？
Ａ＝Ｂ＋３｜
Ａ＝Ｂ＋３＊？？？
Ａ＝Ｂ＋３＊４｜
Ａ＝Ｂ＋３＊（４−？？？）
Ａ＝Ｂ＋３＊（４−Ｃ｜）
上記の例は、プログラムツリーにノードを挿入する間にプログラムツリーエディタによって実行されるノード及び挿入点の好ましいデフォールト選択を示すものである。しかしながら、ユーザがステートメント「Ａ＝Ｂ＋（３＊４）−Ｃ」を入力しようとする場合には、ユーザは、次の表示がなされるまで、上記のようにノードを入力する。
Ａ＝Ｂ＋３＊４｜
次いで、ユーザは、「＊」演算子によって表されたノードを選択し、現在選択を変更する。これを次に示す。
Ａ＝Ｂ＋３＊４｜
次いで、ユーザは、次に示すように「−Ｃ」を入力して操作を進める。
Ａ＝Ｂ＋（３＊４）−？？？
Ａ＝Ｂ＋（３＊４）−Ｃ
【００４０】
プログラムツリーの形成の間には、多数の未定義ノードが存在する。プログラムツリーエディタは、これらのノードを識別する「Ｔｏ−Ｄｏ」リストを維持する。この「Ｔｏ−Ｄｏ」リストは、未定義ノードの形成順序又は他の順序で維持することができる。プログラムツリーを変換する前に、プログラマは、典型的に「Ｔｏ−Ｄｏ」リストの全てのノードが定義されるよう確保する。未定義ノードの使用は、プログラマが常に完全な計算構造を入力するように強制せずに、プログラムツリーが正しく構成されるよう確保する。例えば、プログラマは、次のものに対応するプログラムツリーを形成することができる。
ｉｆ（？？？）
｛？？？｝
ｅｌｓｅ
｛Ｂ＝１｝
「Ｔｏ−Ｄｏ」リストは、「ｉｆ」ステートメントの条件部分及び「ｔｈｅｎ」部分に対応する未定義ノードを含む。次いで、プログラマは、プログラムツリーの他の部分を編集し、そして後で、これらの未定義ノードを定義することができる。
【００４１】
プログラムエディタは、挿入点においてデータをペーストすることができる。データのソースは、「ソースウェル」、クリップボード又は他の二次的なソースから得られる。ソースウェルは、次のものを含む。
全てのローカル変数
全てのタイプ
全ての計算構造
全てのグローバル
全ての演算子
全ての手順
ソースウェルの内容は、挿入点に適当に挿入できるデータを表すように挿入点が変化するときに変化する。
【００４２】
プログラムツリーにペーストできるプリミティブノードは、コマンドウェルにおいて個別のコマンドとして得られる。例えば、「Ｐａｓｔｅ＋」は、「＋」ノードをペーストする。プログラムテキストエリアの左にある垂直ツールバーは、これらコマンドを次の分類に編成してリストするのが好ましい。
−  ｉｆ、ｆｏｒ、ｓｗｉｔｃｈ、ｇｏｔｏ、ｌａｂｅｌ等のステートメント  −  ＋、−等の演算の演算子
−  ＝、＋＝等の割当の演算子
−  ＝＝、＞等の関係
−  ＆、＆＆、＜＜等のブール及び論理演算子
−  増加及び減少
−  ＆、＊、−、＞、〔〕等のデータ構造の演算子
−  ｛｝、ａ（）、特殊化等のグループ分け及びコール
【００４３】
キーボードは、プログラムテキストをタイプ入力するのに使用できる。キーストローク及びマウスイベントシーケンスの実質的な部分は、プログラムツリーエディタのコマンドキーストロークマッピングファシリティにより取り扱われる。プログラムツリーエディタは、キーボード入力をトークンに分割する。トークンの終わりに達する前に、バックスペースを用いてトークンを編集し、挿入点においてスクリーン上にトークンテキストを見ることができる。トークンは、次のいずれかによって輪郭定めされる。
−  スペース（１つ又は複数）。
−  「ａ＋」のように特殊な文字がアルファ又は数字に続くとき。
−  「＋ｂ」のようにアルファ又は数字が特殊な文字に続くとき。
−  幾つかの文字がそれ自体でトークンを形成し、例えば、セミコロンの前の      ものを終わらせる。
−  アルファ及び特殊文字の両方を含むトークンに対し他の脱出規定がある。
【００４４】
次いで、トークンは、種々のキーマップ及び記号リストにおいてルックアップされる。
−  先ず、トークンにキーマップ内のコマンドが直接関連される。例えば、ト      ークン「ｉｆ」は、「Ｐａｓｔｅ  ｉｆ」コマンドの実行を生じる。
−  次いで、トークンは、選択からルートに向かいツリーをトラバースするこ      とにより「ルックアップ」される。トークナイザは、構造宣言においてフ      ィールド選択の右のオペランドをサーチする。又、トークナイザは、手順      におけるローカル宣言、モジュールにおけるグローバル宣言及びシステム      ライブラリーにおける宣言もサーチする。又、プログラムツリーエディタ      は、種々のＤＣＬ  ＴＥに関連したネームを含む記号リストを維持するの      が好ましい。トークナイザは、このリストを一致する名前に対してサーチ      することができる。トークンが独特のネームを表さない場合には、トーク      ナイザは、プログラマに更に別の識別情報を与えて、プログラマが非独特      のネームで適当なノードを識別するよう助けることができる。
【００４５】
従って、プログラムツリーエディタは、典型的にシステムライブラリーにおけるオペレーションのネームとして、例えば、トークン「＋」を見つける。このトークンの作用は、「Ｐａｓｔｅ  ＋」コマンドを実行して「＋」演算子ノードをプログラムツリーへペーストすることである。
【００４６】
又、プログラムエディタのツリーは、プログラムツリーのディスプレイ表示を拡張し崩壊するためのコマンドも与える。プログラムツリーのディスプレイ表示は、アウトライン形態で全体的に又は部分的に拡張及び崩壊することができる。崩壊されるエレメントは、左マージンにおけるグレーバレットによって識別される。次のコマンドは、ディスプレイ表示を拡張及び崩壊するのに使用できる。即ち、ｅｘｐａｎｄ  ａｌｌ（全て拡張）、ｅｘｐａｎｄ  ｎｅｘｔ  ｌｅｖｅｌ（次のレベルの拡張）、ｃｏｌｌａｐｓｅ  ａｌｌ（全て崩壊）及びｃｏｌｌａｐｓｅ  ｎｅｘｔ  ｌｅｖｅｌ（次のレベルの崩壊）。
【００４７】
図８は、ファシリティのプログラムツリー変更サブルーチンのフローチャートである。ステップ８０１ないし８０７において、ファシリティは、プログラムツリーをロードし、プログラムツリーの表示を発生して表示しそしてプログラマがプログラムツリーにノードを挿入できるようにする。ステップ８０１において、ファシリティは、プログラマが使用できるディスプレイ表示フォーマットを選択できるようにする。好ましい実施例では、ユーザが後で別のディスプレイ表示フォーマットを選択してもよく、そしてファシリティは、プログラムツリーを表示するときにその新たに選択されたフォーマットを使用する。
【００４８】
ステップ８０２において、ファシリティは、プログラマからのコマンドに応答してプログラムツリーをメモリにロードする。ロードされるプログラムツリーは、プログラムツリー変更サブルーチンの以前の呼び出しによって記憶されているかもしれない。又、プログラムツリーは、従来のソースコードを分解するような他の方法で形成されているかもしれない。ファシリティは、最初にプログラムツリーを構成するためにこのステップを省略できるのが好ましい。
【００４９】
ステップ８０３において、ファシリティは、選択された表示フォーマットを用いてプログラムツリーのディスプレイ表示を発生する。ディスプレイ表示を発生するために、ファシリティは、プログラムツリーを深さ優先でトラバースし、プログラムツリーの各ノードを、表示フォーマットで指定されたテキスト又はグラフィックで表す。グラフィック又はビットマップの使用は、演算子、オペランドに画像を使用できるようにし、そして宣言ネーム又はポインタ（指示された弧）を対応する宣言に対して描くことができる。例えば、一定値がＩビームカーソルを表す場合には、Ｉビームビットマップを用いて定数の識別子を表すことができる。又、ネームに対して多数の表示フォーマット（特性として記憶された）がある。例えば、ＤＣＬ  ＴＥは、短いネームと長いネームをもつことができる。プログラマは、短いネームを用いてプログラムツリーを表示できるが、プログラマが馴染みのない部分をデバッグするときには、プログラマは、長いネーム（おそらく、より記述的である）を表示することができる。又、別のネームを種々の外国語で記憶することもできる。ディスプレイ表示ジェネレータについては、以下に詳細に述べる。
【００５０】
ステップ８０４において、ファシリティは、ディスプレイ表示をディスプレイ装置に表示する。ファシリティは、挿入点に対応するディスプレイ表示内の位置に挿入点指示を表示する。好ましい実施例において、ファシリティは、長いディスプレイ表示の一部分のみを表示し、ユーザがディスプレイ表示内をスクロールしてファシリティがプログラムツリーの異なる部分を表示できるようにするのが好ましい。ファシリティは、ステップ８０３において、プログラムツリーの表示部分を形成するのに必要なだけのプログラムツリーのディスプレイ表示を発生するのが好ましい。
【００５１】
ステップ８０５において、プログラマがノードを挿入しようとする場合には、ファシリティは、ステップ８０６へと続いてノードを挿入するか、さもなくば、サブルーチン復帰となる。ステップ８０６において、ファシリティは、新たなノードを挿入する。プログラマは、挿入すべきノードのタイプと、ノードを挿入すべきところのプログラムツリー内の位置とを選択することにより新たなノードを選択する。ノードを挿入するプロセスについては、以下で詳細に述べる。
【００５２】
ステップ８０７において、ファシリティは、挿入されたノードを含むプログラムツリーを記憶する。ファシリティは、プログラムツリーをメモリ又は記憶装置或いはその両方に記憶することができる。プログラムツリーが記憶された後の任意の時点で、それがプログラマによって種々の方法で使用される。例えば、プログラマは、記憶されたプログラマツリーを実行可能なコードに変換することもできるし、或いはプログラマは、デバッグユーティリティを呼び出すことによってプログラマツリーをデバッグすることもできる。ステップ８０７の後に、ファシリティはステップ８０３へ続き、挿入されたノードを含むプログラムツリーに対するディスプレイ表示を発生し、その発生されたディスプレイ表示を表示し、そしてプログラマが更に別のノードを挿入できるようにする。ステップ８０８において、挿入ノードコマンド以外のコマンドが受け取られた（例えば、挿入点の選択又は再位置設定）場合に、ファシリティは、ステップ８０９においてコマンドを処理し、そしてステップ８０３へループしてディスプレイ装置を更新する。
【００５３】
図９は、ステップ８０３を詳細に示す新たなノード挿入ルーチンのフローチャートである。ステップ９０１ないし９０７において、ファシリティは、プログラマが挿入点において指定したタイプのノードを挿入し、その新たなノードによって必要とされる位置保持ノード挿入し、そして新たな挿入点を選択する。
【００５４】
ステップ９０１において、ファシリティは、ユーザがディスプレイ表示を参照して挿入点を選択できるようにする。このステップにおいて、ファシリティは、プログラムツリーのノード又はプログラムツリーのノード間の分離のいずれかに対応するディスプレイ表示の位置をプログラマが挿入点として選択できるようにする。プログラマは、ポインタ装置を用いてディスプレイ表示を指すことにより挿入点を選択することができる。又、プログラマは、キーボードを使用し、カーソルをディスプレイ表示内の挿入点へ移動するカーソル位置設定キーの組み合わせを押すことにより挿入点を選択してもよい。又、プログラマは、ファシリティによって与えられる挿入点位置設定コマンドを使用してもよい。これらのコマンドは、挿入点を絶対的に又は挿入点の現在位置に対して相対的にプログラムツリー内の所与の位置へ移動させる。
【００５５】
ステップ９０３において、ファシリティは、挿入点に挿入すべきノードのタイプをプログラマが選択できるようにする。好ましい実施例において、ファシリティは、使用できるノードタイプに対してペーストコマンドのリストを表示し、ユーザがその１つを選択できるようにする。ファシリティは、各ノードタイプの子として挿入できるノードのタイプを指定するのが好ましい。ユーザがノードタイプをペーストするように選択した後、ファシリティは、選択されたタイプのノードを挿入点に適切に挿入できることを照合する。これは、このタイプのノードが挿入点より上のノードの適切な子であることをチェックすることを含む。選択されたタイプのノードを挿入点に適切に挿入できない場合、ファシリティは、プログラマが別のノードタイプ又は挿入点を選択できるようにするのが好ましい。
【００５６】
ステップ９０４において、ファシリティは、選択されたタイプのノードを挿入点においてプログラムツリーに挿入する。挿入点がプログラムツリーのノードである場合には、ファシリティは、挿入点にあるノードを挿入されたノードと置き換える。一方、挿入点がプログラムツリーのノード間の分離部にある場合には、ファシリティは、挿入されたノードを挿入点より上のノードの子としそして挿入点より下のノードを挿入されたノードの子とする。
【００５７】
ファシリティは、各タイプのノードに対して最小数の子を指定するのが好ましい。ステップ９０５において、ファシリティは、選択されたタイプのノードに対していかに多くの子が必要とされるかを調べるようチェックする。選択されたタイプのノードが、挿入されたノードが現在有する以上の子を必要とする場合は、ファシリティは、ステップ９０６に続き、位置保持(placeholder) ノードと称する特殊なタイプのノードを、挿入されたノードが所要数の子をもつまでその挿入されたノードの子として挿入し、さもなくば、ファシリティは、ステップ９０７へ続く。
【００５８】
ステップ９０７において、ファシリティは、新たな挿入点を選択する。ファシリティは、プログラマが次に選択するであろう挿入点を選択する。このため、ファシリティがステップ９０６において位置保持ノードを挿入した場合には、ファシリティは、挿入された位置保持ノードの１つを選択するのが好ましい。ファシリティが正しい挿入点を選択した場合には、プログラマは、次の挿入点を選択する段階をスキップし、挿入すべきノードの次のタイプの選択へと直接進むことができる。
【００５９】
コマンドウェルエディタ
コマンドウェルエディタは、プログラマツリーエディタのユーザインターフェイスを構成を制御する。ファシリティは、ファシリティによって与えられる各コマンドを含むコマンドウェルを備えているのが好ましい。好ましい実施例において、各コマンドには、そのコマンドを実行するための独特の識別子及びファンクションが組み合わされる。好ましいコマンドウェルは、「コンピュータシステムにおいてユーザインターフェイスをカスタマイズする方法及び装置(METHOD AND SYSTEM FOR CUSTOMIZING A USER INTERFACE IN A COMPUTER SYSTEM) 」と題する米国特許出願第０７／８１９，１９４号に開示されている。プログラマツリーエディタは、メニューハイアラーキ、種々のツールバー及び種々のキーマップを含むユーザインターフェイスを与える。コマンドウェルエディタは、プログラマがユーザインターフェイスをカスタマイズできるようにする。コマンドウェルエディタは、プログラマがメニューハイアラーキを指定できるようにする。プログラマは、メニュー項目のネームと、そのメニュー項目が選択されたときに実行するための対応するコマンドとを指定することができる。ユーザインターフェイスは水平及び垂直のツールバーを含むのが好ましい。コマンドウェルエディタは、プログラマがどのコマンドをツールバーに含ませるかを指定できるようにする。各コマンドは、典型的に、ツールバーのためのボタンを指定するビットマップを有している。ユーザインターフェイスは、左のマージンと、プログラムテキストキーマップとを含んでいるのが好ましい。コマンドウェルエディタは、プログラマがコマンドに対してキー（又はマウスイベント）のマッピング又はキーのシーケンスを指定できるようにする。例えば、プログラムテキストエリアにおけるダブルクリックを、ノードを選択するコマンドに対してマップしてもよく、一方、左マージンにおけるダブルクリックを、サブツリーを表示するコマンドに対してマップしてもよい。又、プログラマが文字「ｉｆ」（「ｉｆ」トークン）を、プログラムテキストキーマップにおける「Ｐａｓｔｅ  ｉｆ」コマンドに対してマップする場合には、プログラマがプログラムテキストエリア内に「ｉｆ」をタイプしたときに、「Ｐａｓｔｅ  ｉｆ」コマンドが実行され、現在挿入点にノードを挿入させる。
【００６０】
図７は、コマンドウェルエディタのユーザインターフェイスの要素を示している。コマンドウェルエディタは、プログラムツリーエディタによって実行される全てのコマンドのリストを備えている。コマンドウェルエディタは、プログラマが各コマンドに関連したビットマップを指定できるようにする。コマンドウェルエディタは、プログラマがユーザインターフェイスのどのカテゴリをカスタマイズすべきか選択できるようにするカテゴリリストボックスを備えている。メニューカテゴリは、プログラマがメニューハイアラーキをカスタマイズできるようにする。ツールバーカテゴリは、プログラマがツールバーをカスタマイズできるようにする。キーカテゴリは、プログラマがキーマップをカスタマイズできるようにする。
【００６１】
ディスプレイ表示ジェネレータ
ディスプレイ表示ジェネレータは、プログラムツリーエディタから要求を受け取り、プログラムツリーの表示をディスプレイ装置に表示する。ディスプレイ表示ジェネレータは、現在選択されているディスプレイ表示フォーマットに基づいて表示を行うようにプログラムツリーの各ノードに要求する。ディスプレイ表示ジェネレータは、プログラムツリーを深さ優先で左から右へトラバースする。
【００６２】
図１０は、ステップ８０６を詳細に示すディスプレイ表示発生サブルーチンのフローチャートである。ツリーを表示するための公知技術が存在することが当業者に明らかであろう。ステップ１００１ないし１００６において、ファシリティは、深さ優先で左から右へプログラムツリーをトラバースしそして各ノードに対してディスプレイ表示を発生することによりプログラムツリーのディスプレイ表示を発生する。ステップ１００１において、ファシリティは、プログラムツリーのサブツリーを選択することによりディスプレイ表示を発生すべきところのプログラムツリーの部分を決定する。サブツリーは、クラウンコードによって定められ、クラウンノードと、クラウンノードの全ての子孫とを含んでいる。ファシリティは、ディスプレイ表示に対して割り当てられたディスプレイ装置のスペースをディスプレイ表示が埋めようとするところのサブツリーを現在ノードが定義するまで、挿入点からツリーをアップ方向に移動することによりクラウンノードを選択するのが好ましい。
【００６３】
ステップ１００２において、ファシリティは、ディスプレイリストと称するデータ構造体を形成する。ファシリティは、ディスプレイリストを完全に拡張した後に、それを用いて表示を行う。ディスプレイリストは、各々拡張できるか又は非拡張であるかのいずれかであるディスプレイリスト項目を含むリンクされたリストである。非拡張のディスプレイリスト項目は、サブツリーのノードに対応する。一方、拡張ディスプレイリスト項目は、サブツリーの特定ノードのタイプに関連したディスプレイ表示の１つ以上の部片のうちの１つに対応する。ステップ１００３において、ファシリティは、クラウンノードに対応する非拡張ディスプレイリスト項目をディスプレイリストに挿入する。ステップ１００４ないし１００６において、ファシリティは、ディスプレイリストが完全に拡張されるまで、ディスプレイリスト項目を徐々に拡張する。
【００６４】
ステップ１００４において、ディスプレイリストが非拡張ディスプレイリスト項目を含む場合には、ファシリティはステップ１００５へ続き、さもなくば、サブルーチンは復帰となる。ステップ１００５において、ファシリティは、ディスプレイリストの開始部に最も近い非拡張ディスプレイリスト項目を、選択された表示フォーマットで指定されたディスプレイリスト項目の交換セットと置き換える。ディスプレイリスト項目のあるものは、拡張できそして実際のディスプレイ表示に対応し、一方、他のものは、拡張できずそしてその置き換えられたディスプレイリストエントリに対応するノードの子であるサブツリーのノードに対応する。ステップ１００６において、ファシリティは、交換セットの非拡張のディスプレイリスト項目の内容を変更し、その置き換えられるディスプレイリストエントリに対応するノードの特定の子ノードを各々指示するようにする。
【００６５】
図１１ないし１４は、２つの新たなノードをサブツリーに挿入する間の種々の時間においてサブツリーの内容及びディスプレイ表示を例示した図である。図１１は、挿入が実行される前のサブツリーの内容及びディスプレイ表示を例示している。サブツリー１１１０は、ディスプレイ動作を指定するそのクラウン、即ちプリントノード１１１１によって定義される。このプリントノードは、グループ分けノード（図示せず）のような別のノードの子である。「Ａ」変数の参照ノード１１１２及び「ＩＳ  ＴＨＥ  ＡＮＳＷＥＲ」ストリングノード１１１３は、プリントノードの子である。対角バーとして示された挿入点１１１４は、プリントノードの上に配置される。ディスプレイ表示１１２０は、サブツリーに対応するテキスト１１２１の行を含む。垂直バーカーソルとして示された挿入点１１２２は、この行の始めに配置される。
【００６６】
次いで、プログラマは、この挿入点をディスプレイ表示において文字「Ａ」と「，」との間へ移動する。プログラマは、ポインタ装置で新たな位置を指すか、カーソルを新たな位置へ移動するためのカーソル位置設定キーを用いるか、又は子の位置への移動コマンドを用いることによって挿入点を移動する。図１２は、ファシリティが「Ａ」変数参照ノードの上に挿入点を移動した後のプログラムツリー及びディスプレイ表示を例示している。挿入点１１４２は、現在、「Ａ」文字と「，」文字との間に配置されている。挿入点１１３１は、プリントノードと「Ａ」変数参照ノードとの間へ移動されている。
【００６７】
次いで、プログラマは、現在挿入点に挿入（ペースト）すべき乗算ノードタイプを選択する。図１３は、ファシリティが「Ａ」変数参照ノードの親として乗算ノードを挿入した後のプログラムツリー及びディスプレイ表示を例示している。サブツリーにおいて、ファシリティは、乗算ノード１１５１を「Ａ」変数参照ノードの親として挿入している。乗算ノードは、少なくとも２つの子を必要とするので（乗算が２進演算であるとき）、ファシリティは、新たな乗算ノードの第２の子として位置保持ノード１１５２も挿入している。ユーザは、この位置保持ノードに取って代わるノードを次に挿入し勝ちであるので、ファシリティは、挿入点１１５２を位置保持ノードへ移動している。ディスプレイ表示においては、ファシリティは、新たな乗算ノードに対するディスプレイ表示としてアスタリスクと、新たな位置保持ノードに対するクエスチョンマークとを発生し、そして挿入点をクエスチョンマークへ移動している。
【００６８】
次いで、プログラムは、挿入点に挿入するために「Ｂ」変数参照ノードタイプを選択する。図１４は、ファシリティが「Ｂ」変数参照ノードを乗算ノードの子として挿入した後のプログラムツリー及びディスプレイ表示を例示している。サブツリーにおいて、ファシリティは、位置保持ノードに置き換えるために「Ｂ」変数参照ノード１１７１を挿入している。ユーザは、「Ｂ」変数参照ノードの後にノードを次に挿入し勝ちであるから、ファシリティは、「Ｂ」変数参照ノードの下に挿入点１１７２を移動している。ディスプレイ表示において、ファシリティは、クエスチョンマークに代わり新たに挿入されたノードのディスプレイ表示として「Ｂ」を発生しそして挿入点を「Ｂ」の後に移動している。
【００６９】
図１１ないし１４において各ディスプレイ表示を発生するために、ファシリティは、ディスプレイ表示発生サブルーチンを実行する。図１５ないし２０は、図１４に示したディスプレイ表示を発生するためのディスプレイ表示発生サブルーチンの実行を示している。図１５は、ディスプレイ表示発生の開始におけるディスプレイリストを示している。サブツリー１２１０は、ノード１２１１ないし１２１５を有している。ディスプレイリスト１２２０は、単一ディスプレイリストエントリ１２２１を有している。ディスプレイリストエントリ１２２１は、ディスプレイリストエントリの内側の文字「Ｕ」で示されたように非拡張であり、その内容インジケータは、プリントノード１２１１を示している。
【００７０】
図１６は、ディスプレイリストエントリ１２２１の拡張を示すディスプレイリストの図である。ディスプレイリストは、ディスプレイリスト項目１２２２ないし１２２７を有している。これらのディスプレイリストエントリは、ベーシック言語のディスプレイ表示フォーマットのプリントノードに対する交換セット内のものである。又、エントリ１２４１ないし１２４４を有するストリングテーブル１２４０も示されている。ディスプレイリストエントリ１２２２は拡張され、その内容インジケータは、「ＰＲＩＮＴ」ストリング１２４１を示す。ディスプレイリストエントリ１２２２が表示されたときには、「ＰＲＩＮＴ」ストリングが表示される。ディスプレイリストエントリ１２２３、１２２５及び１２２７も拡張され、それらの内容インジケータの各々も、ディスプレイリストが表示されるときに表示されるストリングを指示する。ディスプレイリストエントリ１２２４は、非拡張であり、その内容インジケータは、乗算ノード１２１２を指示する。ディスプレイリストエントリ１２２６も、同様に非拡張であり、その内容インジケータは、「ＩＳ  ＴＨＥ  ＡＮＳＷＥＲ」ストリングノード１２１５を指示する。非拡張ノードについて更に述べる。
【００７１】
図１７は、ディスプレイリストエントリ１２２４の拡張を示すディスプレイリストの図である。ファシリティは、拡張のためにディスプレイリストエントリ１２２４を選択する。というのは、これは、ディスプレイリストにおける最初の非拡張ディスプレイリストエントリだからである。ディスプレイリストエントリ１２２４は、ディスプレイリスト項目１２２８ないし１２３０へと拡張されている。ディスプレイリストエントリ１２２８は、非拡張であり、その内容インジケータは、「Ａ」変数参照ノード１２１３を指示する。ディスプレイリストエントリ１２２９は拡張され、その内容インジケータは、「＊」ストリング１２４１を指示する。ディスプレイリストエントリ１２２４は非拡張であり、その内容インジケータは、「Ｂ」変数参照ノード１２１４を指示する。
【００７２】
図１８ないし２０は、ディスプレイリストエントリ１２２６、１２２８及び１２３０の拡張を示すディスプレイリストの図である。図２０において、ディスプレイリストは完全に拡張されている。ファシリティは、ディスプレイリストをその始めから終わりへトラバースし、各ディスプレイリストエントリの内容インジケータによって指示されたストリングのテキストを表示することにより、図１４に示すように非ペーストテキストを表示するための完全に拡張されたディスプレイリストを表示する。
【００７３】
本発明をその好ましい実施例について説明したが、本発明はこれらの実施例に限定されるものではない。本発明の精神から逸脱せずに変更がなされ得ることが当業者に明らかであろう。本発明の範囲は、特許請求の範囲によって限定されるものとする。
【図面の簡単な説明】
【００７４】
【図１】ファシリティが好ましく動作する汎用コンピュータの高レベルブロック図である。
【図２】好ましい実施例におけるファシリティの要素のブロック図である。
【図３】例示的なプログラムツリーを示す図である。
【図４】例示的なプログラムツリーのＣディスプレイ表示を示す図である。
【図５】例示的なプログラムツリーのリスプディスプレイ表示を示す図である。
【図６】プログラムツリーエディタの選択メニューの選択を示す図である。
【図７】コマンドウェルエディタのユーザインターフェイスの要素を示す図である。
【図８】ファシリティのプログラムツリー変更サブルーチンを示すフローチャートである。
【図９】新たなノードを挿入するサブルーチンを示すフローチャートである。
【図１０】ディスプレイ表示発生サブルーチンを示すフローチャートである。
【図１１】２つの新たなノードをサブツリーに挿入する間の種々の時間中におけるサブツリーの内容及びディスプレイ表示を例示する図である。
【図１２】２つの新たなノードをサブツリーに挿入する間の種々の時間中におけるサブツリーの内容及びディスプレイ表示を例示する図である。
【図１３】２つの新たなノードをサブツリーに挿入する間の種々の時間中におけるサブツリーの内容及びディスプレイ表示を例示する図である。
【図１４】２つの新たなノードをサブツリーに挿入する間の種々の時間中におけるサブツリーの内容及びディスプレイ表示を例示する図である。
【図１５】ディスプレイ表示発生ツリーサブルーチンの実行を示す図である。
【図１６】ディスプレイ表示発生ツリーサブルーチンの実行を示す図である。
【図１７】ディスプレイ表示発生ツリーサブルーチンの実行を示す図である。
【図１８】ディスプレイ表示発生ツリーサブルーチンの実行を示す図である。
【図１９】ディスプレイ表示発生ツリーサブルーチンの実行を示す図である。
【図２０】ディスプレイ表示発生ツリーサブルーチンの実行を示す図である。
【符号の説明】
【００７５】
１００  コンピュータシステム
１０１  ＣＰＵ
１０２  コンピュータメモリ
１０３  入力／出力装置
１０４  記憶装置
１０５  キーボード
１０６  ポインタ装置
１０７  ディスプレイ装置
２０１  ソフトウェア機構（ファシリティ）
２０２  プログラムツリーエディタ
２０３  コマンドウェルエディタ
２０４  ディスプレイ表示ジェネレータ
２０５  プログラムツリー変換器
２０６  コマンドウェル
２０７  ユーザインターフェイスマップ
２０８  プログラムツリー
【図１】
0004448881.tif 000002
【図２】
0004448881.tif 000003
【図３】
0004448881.tif 000004
【図４】
0004448881.tif 000005
【図５】
0004448881.tif 000006
【図６】
0004448881.tif 000007
【図７】
0004448881.tif 000008
【図８】
0004448881.tif 000009
【図９】
0004448881.tif 000010
【図１０】
0004448881.tif 000011
【図１１】
0004448881.tif 000012
【図１２】
0004448881.tif 000013
【図１３】
0004448881.tif 000014
【図１４】
0004448881.tif 000015
【図１５】
0004448881.tif 000016
【図１６】
0004448881.tif 000017
【図１７】
0004448881.tif 000018
【図１８】
0004448881.tif 000019
【図１９】
0004448881.tif 000020
【図２０】
0004448881.tif 000021