トップ :: G 物理学 :: G06 計算;計数




【発明の名称】 言語設計支援システムに用いる構文解析ルール入力システム、セマンティックマップ入力システム、字句解析入力システム、仮想マシン選択システム
【発明者】 【氏名】雪田 修一

【要約】 【課題】プログラミング言語の設計を支援するためのシステムを提供する。

【解決手段】左辺文法要素および右辺文法要素となる文法要素およびトークンを操作者に選択させるためのメニューを、操作者に認識可能なように表示させる。操作者は、メニューから文法要素またはトークンを選択することで、誤りが少なくかつ容易な入力作業を行うことができる。
【特許請求の範囲】
【請求項1】 左辺文法要素と右辺文法要素とを規定することにより、構文解析ルールを、コンピュータを用いて入力する構文解析ルール入力システムにおいて、前記左辺文法要素および/または右辺文法要素となる文法要素またはトークンを操作者に選択させるためのメニューを、操作者に認識可能なように表示させることを特徴とする構文解析ルール入力システム。
【請求項2】 左辺文法要素と右辺文法要素とを規定することにより、構文解析ルールを、コンピュータを用いて入力する構文解析ルール入力システムにおいて、互いに独立させられたトークンテーブルと文法要素テーブルとを備えており、前記左辺文法要素および/または右辺文法要素となる文法要素またはトークンを操作者に選択させるためのメニューを、前記トークンテーブルまたは文法要素テーブルに含まれるトークンまたは文法要素のデータを用いて、操作者に認識可能なように表示させることを特徴とする構文解析ルール入力システム。
【請求項3】 インストラクションリストと、右辺文法要素テーブルと、トークンテーブルとを備えており、前記インストラクションリストから選択されたインストラクションにおいて引数として取りうる文法要素またはトークンが、前記右辺文法要素テーブルまたはトークンテーブルから、コンピュータにより選択され、かつ、このように選択された文法要素またはトークンから操作者が選択を行うためのメニューを操作者に認識可能なように表示させることを特徴とするセマンティックマップ入力システム。
【請求項4】 字句解析パターンとトークンとの対応付けをコンピュータを用いて入力する字句解析ルール入力システムであって、トークンテーブルを備えており、前記字句解析パターンに対応して選択されるべきトークンのリストを、前記トークンテーブルに含まれるデータを用いて、操作者に選択可能なように、コンピュータにより表示させることを特徴とする字句解析ルール入力システム。
【請求項5】 トークンテーブルに含まれるトークンと、文法要素テーブルに含まれる文法要素とを表示することで、トークンと文法要素とを選択可能とし、これによって言語設計を支援する、コンピュータを用いた言語設計支援システムであって、前記トークンテーブルと前記文法要素テーブルとは互いに独立とされていることを特徴とする言語設計支援システム。
【請求項6】 設計された言語が動作する複数の仮想マシンを規定するためのデータを備え、前記複数の仮想マシンから1つを選択できるよう、前記複数の仮想マシンを含むリストをコンピュータにより表示させる構成となっていることを特徴とする仮想マシン選択システム。
【請求項7】 請求項1〜6のいずれか1項に記載のシステムをコンピュータに実行させるためのプログラム、または、このプログラムを記録した媒体、または、このプログラムを伝送するための信号。
【発明の詳細な説明】【0001】
【発明の属する技術分野】本発明は、プログラム言語の設計を支援するシステムに関し、特に、このシステムにおける構文解析ルール入力システム、セマンティックマップ入力システム、字句解析入力システム、仮想マシン(以下「VM」と略称することがある。)選択システムに関するものである。
【0002】
【従来の技術】(1)YACC、LEX、MAKEに代表されるツール群を使用した伝統的なコンパイラ作成プロセスは、標準的な技術として確立されている。しかしながら、これらのツールは、高度な知識を持つ専門家でなければ使用は難しい。例えば、教育に用いるための小さなプログラミング言語を手軽に作成することは、現状のツールでは難しい。
(2)セマンティックマップは、従来のコンパイラ作成ツールでは、構文解析ルールの記述に密着した煩瑣な書式、例えば、BNF形式にセマンティック実行コードを組み合わせた書式あるいはYACC形式などによっていた。こうした技術の問題点は、非専門家が作成する場合には、記述自由度が大きすぎ、また、書式が複雑すぎることである。
(3)さらに、従来のコンパイラ作成ツールにおいて、字句解析パターンとトークンプールの入力には、Makeファイルのような別の工程管理ツールを必要としていた。これは、字句解析パターンとトークンプールとが相互に依存して規定されていたためである。なお、プログラミング言語設計の基礎知識については、例えば、「武市正人著:岩波講座ソフトウエア科学4 プログラミング言語 (岩波書店)」などの文献に記載されている。
【0003】
【発明が解決しようとする課題】本発明は、前記の事情に鑑みてなされたものである。本発明の目的は、プログラミング言語の設計を支援するためのシステムを提供することである。
【0004】
【課題を解決するための手段】請求項1記載の構文解析ルール入力システムは、左辺文法要素と右辺文法要素とを規定することにより、構文解析ルールを、コンピュータを用いて入力する構文解析ルール入力システムであって、前記左辺文法要素および/または右辺文法要素となる文法要素またはトークンを操作者に選択させるためのメニューを、操作者に認識可能なように表示させる構成となっている。本発明におけるシステムは、コンピュータにより実現できる。したがって、本システムが実行されているコンピュータ上の動作を、入力方法の発明として把握することもできる。以下の請求項においても同様である。
【0005】請求項2記載の構文解析ルール入力システムは、左辺文法要素と右辺文法要素とを規定することにより、構文解析ルールを、コンピュータを用いて入力する構文解析ルール入力システムにおいて、互いに独立させられたトークンテーブルと文法要素テーブルとを備えており、前記左辺文法要素および/または右辺文法要素となる文法要素またはトークンを操作者に選択させるためのメニューを、前記トークンテーブルまたは文法要素テーブルに含まれるトークンまたは文法要素のデータを用いて、操作者に認識可能なように表示させる構成となっている。
【0006】請求項3記載のセマンティックマップ入力システムは、インストラクションリストと、右辺文法要素テーブルと、トークンテーブルとを備えており、前記インストラクションリストから選択されたインストラクションにおいて引数として取りうる文法要素またはトークンが、前記右辺文法要素テーブルまたはトークンテーブルから、コンピュータにより選択され、かつ、このように選択された文法要素またはトークンから操作者が選択を行うためのメニューを操作者に認識可能なように表示させる、構成となっている。
【0007】請求項4記載の字句解析ルール入力システムは、字句解析パターンとトークンとの対応付けを、コンピュータを用いて入力する字句解析ルール入力システムであって、トークンテーブルを備えており、前記字句解析パターンに対応して選択されるべきトークンのリストを、前記トークンテーブルに含まれるデータを用いて、操作者に選択可能なように、コンピュータにより表示させる構成となっている。
【0008】請求項5記載の言語設計支援システムは、トークンテーブルに含まれるトークンと、文法要素テーブルに含まれる文法要素とを表示することで、トークンと文法要素とを選択可能とし、これによって言語設計を支援する、コンピュータを用いた言語設計支援システムであって、前記トークンテーブルと前記文法要素テーブルとは互いに独立とされている構成となっている。
【0009】請求項6記載の仮想マシン選択システムは、設計された言語が動作する複数の仮想マシンを規定するためのデータを備え、前記複数の仮想マシンから1つを選択できるよう、前記複数の仮想マシンを含むリストをコンピュータにより表示させる構成となっているものである。
【0010】請求項7記載の発明は、請求項1〜6のいずれか1項に記載のシステムをコンピュータに実行させる(すなわち、システムの機能をコンピュータにより実現する)ためのプログラム、または、このプログラムを記録した媒体、または、このプログラムを伝送するための信号とされている。
【0011】
【発明の実施の形態】本発明の一実施形態に係る、教育用のプログラミング言語支援システムを説明する。ただし、教育用はあくまで用途の一例であり、これには限らない。
【0012】第1章 はじめに1.1 教育用プログラミング言語設計支援システムとは教育用プログラミング言語設計支援システムとは、プログラミングを教育する際に必要となる言語処理系を簡単に作成するためのツールである。言語デザイナは、言語処理系作成の際に必要とされる、字句解析仕様と構文解析仕様の設計、そしてセマンティックマップのすべてを、システムが提供するGUI上で行うことができる。更に、生成される言語処理系は、全てJava言語により実現されるので、プラットホームに依存しない。また、このシステムは、言語処理系を生成するための代表的なツールである、java cup[1]とJFlex[2]にGUIを載せる形で実現されている。
(関連資料)
[1] S.E. Hudson. CUP User's Manual - CUP LALR PAarser Generator for Ja va. Techinical report, 1998. (http://www.cs.princeton.edu/~ap pel/)[2] G. Klein. JFlex Manual - The Fast Scanner Generator for Java. T echnical report, 1999. (http://www.jflex.de/)この明細書においては、以後、「教育用プログラミング言語設計支援システム」を略して、「デザインシステム」と呼ぶことがある。
注意:このシステムを使用する者(言語デザイナ)には、言語処理系の基礎知識が必要とされる。より詳細な必要知識については、後述の1.3 を参照されたい。
(実施に必要なシステム構成の例)例えば、下記の構成を持つAT互換機またはUNIXシステムを実施のために使用することができる。ただし、この構成に限らない。
AT 互換機:ハードウエア・ CPU:PentiumII 233MHz 以上・ メモリ: 64MB 以上・ HDD:2GB 以上OS・ Microsoft WindowsNT Workstation 4.0+ServicePack4 以降・ Windows98 以降その他・ Java 2 SDK, Standard Edition Version 1.2.2 以降のSDK がコンピュータにインストールされている。
Unix System:ハードウエア・ CPU:UltraSparcII 300MHz/MicroSparcII 110MHz 以上・ メモリ: 64MB 以上・ HDD:2GB 以上OS・ Solaris 2.6 以降その他Java 2 SDK, Standard Edition Version 1.2.2 以降のSDK がインストールされている。
【0013】1.2 例このシステムにより生成することのできる言語処理系の一例を紹介する。図1は、生成された言語処理系を、システムが提供するテスト用GUIにより、表示した画面である。この言語処理系は、四則演算、繰り返し処理、標準出力へのプリントなどの、プログラミングの際に核となる処理が行える。また、言語処理系の意味実行モジュールである仮想マシン(VM)は、変数の状態とコンパイル後のコードの処理内容を、内部処理過程表示機能(これについては説明を省略する。)により、可視化することができる。この例では、一般的な計算処理のインストラクションをもつ"汎用VM"を、意味実行モジュールに選んでいる(詳しくは後述する)。この他に、表計算のためのインストラクションを充実させた"テーブル処理VM"を意味実行モジュールとすることにより、テーブル処理のための言語処理系を作ることもできる。更に、テキスト処理のためのインストラクションを充実させた"テキストVM"も選択可能である。
【0014】1.3 言語処理系作成までの流れここでは、デザインシステムを用いた言語処理系作成の流れを説明する。まず、このシステムを実行するためのプログラムのインストールを行い、起動する。プログラムの詳細は、本明細書および公知技術に基づけば当業者に容易な設計事項なので、詳細の説明は省略する。デザインシステムGUI のコンポーネントとその使用法については、下記第3章を参照されたい。本実施形態のシステムを用いて言語処理系(プログラミング言語)作成する際に必要とされる手順(これは最低限の手順と考えられる)は、以下のようになる。また、括弧内に示した章にはその詳細が記載されている。
1.プロジェクトの作成(4.1)言語処理系作成のプロジェクトを新規作成する。また、作成する言語処理系で実行できる処理のタイプ(VMのタイプ)も決定する。
2.字句解析モジュールの設計(4.2)字句解析モジュールを設計する。設計の際には、使用者(作成者)は正規表現を記述できる必要がある。
3.構文解析モジュールの設計(4.3)構文解析モジュールを設計する。設計の際には、文脈自由文法(context freegrammar)を記述できる必要がある。
4.セマンティックマッピング(4.4)解析されたソースコードに対して、実行される処理の内容(VM命令)をマッピングする。各VMにおけるVM命令の一覧は、後述する第7章にある。
5.言語処理系を生成(4.5)入力されたデータをもとに、言語処理系をビルドする。更に、より高度な言語処理系を作成するために、言語処理系仕様のソースファイルを直接カスタマイズすることも可能である。第5章を参照されたい。また、作成した言語処理系に対してGUIを載せるには、第6章を参照されたい。注意:これら二項目を行うためには、Java言語を習得している必要がある。
【0015】第2章 インストールと起動方法ここでは、インストールと起動方法について説明する。
2.1 インストール方法OSがWindowsでも、UNIXでも、以下の手順に従ってインストール作業を行う。
1. 本システムを実行するプログラムをインストール先のディレクトリへ格納する。ディレクトリ構造の一例は以下の通りである。

2.クラスパスを設定する。例えば、CLASSPATH インストール先のディレクトリ名/designとする。
2.2 起動起動時のGUI の一例を図2に示す。
【0016】第3章 GUIの機能説明ここでは、デザインシステムにおけるGUI(図3)の各コンポーネントの説明をする。
3.1 メインウインドウメインウインドウは、メニューバー、ビルドボタン、トークンプール、字句解析状態プール、文法要素プール、字句解析デザインテーブル、構文解析デザインテーブルを表示する部分を備えている。ビルドボタンは、デザイナから入力された仕様をもとにコードを生成しコンパイルする。メニューバー(図4)は、以下のように構成されている。
ファイル-新規作成:新規プロジェクトを作成する。詳細は、4.1 を参照されたい。
-開く:既存のプロジェクトを開く。
-保存:編集中のプロジェクトを保存する。
-終了:システムを終了する。
編集-ビルド:デザイナから入力された仕様をもとにコードを生成しコンパイルする。
-プロパティ:ビルドする際に必要となる、javaコマンドのパス、java cupのパスを設定する。
-テンプレート編集(jflex、java cup):システムがコードを生成する際に挿入するjflex、java cupのデフォルトのテンプレートを編集する。
3.2 トークンプール(図5)
ここでは、トークンを定義して、トークンのデータベースであるトークンテーブルを作成する。テーブルの1レコードは、トークン名(必須)、優先順位(オプション)、左右の結合性(オプション)、システム内部でのクラス(オプション)の4つのフィールドから構成されている。トークン名の入力は、キーボード入力となる。優先順位(数字)の入力は、キーボード入力またはプルダウンメニューの項目から選択となる。左右の結合性の入力は、プルダウンメニューの項目から選択となる。システム内部でのクラスの入力は、キーボード入力、または、プルダウンメニューの項目から選択となる。トークンテーブルにおけるレコードの追加削除は、"トークンを追加"・"トークンを削除"のボタンにより行う。
3.3 字句解析状態プール(図6)
スキャナに状態をもたせるときには、ここで定義を行い、テーブルを作成する。入力は、キーボード入力となる。レコードの追加削除は、"状態を追加"・"状態を削除"のボタンにより行う。
3.4 文法要素プール(図7)ここでは、文法要素(no-terminal 、variable)を定義することで、文法要素テーブルを作成する。テーブルにおける1レコードは、文法要素(必須)、システム内部でのクラス(オプション)の2つのフィールドから構成されている。文法要素の入力は、キーボード入力となる。システム内部でのクラスは、キーボード入力またはプルダウンメニューの項目から選択となる。レコードの追加削除は、"文法要素を追加"・"文法要素を削除"のボタンにより行う。
3.5 字句解析デザインテーブル(図8)このテーブルでは、字句解析仕様を決定する。テーブルの1レコードは、パターン(必須)、トークン名(オプション)、状態(オプション)、次の状態(オプション)の4つのフィールドから構成されている。パターンの入力は、そのフィールドをダブルクリックすることによりポップアップされるパターンダイアログにおいてキーボード入力またはリストからの選択となる。トークン名の入力は、プルダウンメニューの項目(トークンプールに登録されている項目)から選択となる。状態の入力は、プルダウンメニューの項目(字句解析状態プールに登録されている項目)から選択となる。次の状態の入力は、プルダウンメニューの項目(字句解析状態プールに登録されている項目)から選択となる。レコードの追加削除は、"パターンを追加"・"パターンを削除"のボタンにより行う。"コード編集"ボタンは、最終段階において、システムが生成するコードに手を加えたいときに1レコードごとに編集が行える。
3.6 構文解析デザインテーブル(図9)このテーブルでは、構文解析仕様を決定できる。テーブルの1レコードは、目的文法要素(必須)、文法要素列(必須)、セマンティックス(必須)の3つのフィールドから構成されている。目的文法要素の入力は、プルダウンメニューの項目(文法要素プールに登録されている項目)から選択となる。文法要素列の入力は、そのフィールドをダブルクリックすることによりポップアップされるダイアログにおいて必要な文法要素の数だけキーボード入力またはプルダウンメニューの項目(文法要素プール・トークンプールに登録されている項目)からの選択となる。セマンティックスの入力は、そのフィールドをダブルクリックすることによりポップアップされるセマンティクマッピングダイアログ(3.7を参照)により入力を行う。レコードの追加削除は、"ルールを追加"・"ルールを削除"のボタンにより行う。"コード編集"ボタンを押すと、最終段階において、システムが生成するコードに手を加えたいときに1レコードごとに編集が行えるようになっている。
3.7 セマンティクマッピングダイアログ(図10)このダイアログでは、セマンティックスを決定する。左のパネルには、VM命令・単純値・システム命令のリストが表示される。右のパネルは、VM命令ツリー設計パネルである。詳細は、4.4 を参照されたい。
【0017】第4章 デザインシステムを用いた言語処理系の生成この章では、第1章に挙げた言語処理系の例(以下,この例を"simple calc"と呼ぶ)を実際にシステムで設計する手順を説明する。手順の流れは下記のようになる。
1.プロジェクトの新規作成2.字句解析モジュールの設計3.構文解析モジュールの設計4.言語処理系をビルド4.1 プロジェクトの作成まず始めに、プロジェクトを作成する。GUIで示される"ファイル"メニュー(図4a参照)から"新規作成"を選択する。すると、図11(a)に示すダイアログが表示される。このダイアログに入力する項目には、以下の三つがあり、それぞれ以下のように入力を行う。
1)作成するプロジェクト名作成するプロジェクトの名前をタイプする。また、システムがこの名前のディレクトリを作成するので、作成する場所に同名のディレクトリがすでに存在する場合には、作成できないようになっている。
2)プロジェクトを作成する場所プロジェクトのディレクトリを作成する場所を入力する。入力は、直接タイプする方法と、図11(b)に示すダイアログを使って入力する方法の2通りがある。ダイアログを使用するなら、図11(a)における"参照"ボタンを押す。
3)VMの種類VMの種類をリストから一つ選択する。また、ここで選択したVMは、このプロジェクト中では変更することができない。各VMで仕様可能な命令については、第7章を参照されたい。図12に、simple calc を作成するための入力を完了した画面を示す。プロジェクト名はsimple calc 、VM の種類は"汎用VM"となっている。この例では、新規作成を行うと、以下のようなディレクトリ構造が作られるようになっている(プロジェクト名をsimple calc とした場合)。

プロジェクトの新規作成を行った以後は、ファイルメニューの"保存"と"開く"により、いつでも言語処理系作成の中断と再開が可能となっている。中断する際には、保存を選んで、プロジェクトを保存してから、ファイルメニューから、"終了"を選ぶ。また、保存したプロジェクトを再開したい場合には、デザインシステムを起動した後、メニューから「開く」を選択する。そして、図16に示すように、作成したプロジェクトのディレクトリにあるデザインシステムファイル(ファイル名の例:プロジェクト名.deg)を選択する。
【0018】(VMプール機能の説明)ここで、請求項6に対応するVMプール機能についてさらに説明する。図13に示されるように、この機能のために、VMプールという、コンピュータによって利用可能なデータベース(単に「DB」ということがある)が用いられる。VMプールには、各VM毎のDBが含まれている。図13の例では、テキスト編集VM、汎用VM、テーブル処理VMというDBが含まれる。これらのDBには、各VMで使用するインストラクションが記録されている。この実施形態のシステムでは、VMプールから選択できるVMのリストを、図12の右下に示すように、操作者が選択可能なように表示できるようになっている。操作者がリストからVMを選択すると、システムにインストラクション(群)がロードされ、VMインストラクションテーブルが構成される。
(個々のVMの構成)個々のVMの構成を、図14を用いてさらに説明する。各VMのDB(図中破線で示す)には、VM−Specファイルと、VMコードインタプリタという、二つのデータが備えられている。VM−Specファイルは、VMインストラクションが記録されたデータベースである。ここには、システムによってロードされて、VMインストラクションとなるデータが格納されている。VMコードインタプリタは、VMコードを解釈して実行するインタプリタであり、入出力を含むインストラクションセットを持っている。後述するように、本実施形態のシステムでは、VMインストラクションテーブルを用いて言語処理系のプログラムを作成することができる。このプログラムが作成されると、VMコードがVMコードインタプリタに渡されて、VMが動作する。
(セマンティックマップとの連係)後述するが、図15に示されるように、VMインストラクションテーブルにおけるインストラクションは、セマンティックマップダイアログに表示されて、選択可能とされる。さらに、セマンティックマップダイアログは、構文解析ルール入力システムとも連係しており、入力した構文解析ルールに対応したセマンティックマップを表示するようになっている。
4.2 字句解析モジュールの設計字句解析モジュールとは、図17に示すように、言語処理系に入力されたソースコードを、意味の最小単位であるトークンへ分解するモジュールである。字句解析モジュールの設計の為のデータは、入力する順番に並べると以下のようになる。
1.トークン2.字句解析状態3.字句解析仕様以下に、順を追ってこれらを説明する。
4.2.1 トークンを定義まず、トークンを定義する。定義には、メインウインドウの左上に配置されているトークンプール(図18(a)参照)を使用する。入力すべき項目は、トークン名、結合方向、結合の順位、そしてトークンのクラスである。図18(b)は、simple calc におけるトークンの定義を完了した結果を示している。
トークン名:作り出す予定の言語処理系に必要なトークン名を"トークン"の列に入力する。入力には、図19(a)に示すように、セルを選んでトークン名をタイプする。simple calc においては、必要なトークンとして以下のようなものがある。
・ 数字: NUMBER・ 演算子: EQ, PLUS, MINUS, TIMES, DIVIDE・ 変数の識別子: ID・ 括弧: LPAREN, RPAREN, LBLOCK, RBLOCK・ インストラクション名: PRINT, FOR・ セパレータ: SEMIここまでシステムに対して入力した結果を図19(b)に示す。
結合方向:結合方向が存在するトークンに対して、"結合"の列に結合方向を指定する。入力には、図20(a)に示すように、セルを選んで、プルダウンメニューから、結合方向(rightかleft)を選べるようになっている。simple calc においては、演算子を表すトークンに結合方向が存在する。
・ 左結合: PLUS, MINUS, TIMES, DIVIDE・ 右結合: EQここまでシステムに対して入力した結果を図20(b)に示す。
結合順位:結合順位が存在するトークンに対して、"順位"の列に結合順位を自然数で入力する。数字の大きいトークンがより大きい結合力を持つ事になる。入力には、図21(a)に示すように、セルを選んでプルダウンメニューから数字を選ぶか、キーボードで直接タイプする。simple calc においては、演算子を表すトークンの結合力は以下のようになる。
TIMES = DIVIDE > PLUS = MINUS > EQこの関係を入力した結果の例を、図21(b)に示す。
トークンのクラス:トークンによっては、そのの種類だけでなく値をもつ場合がある。そのようなトークンに対しては、Java のクラスのオブジェクトとして値を持たせることができる。値を持つトークンに対して、"クラス"の列に値の型であるクラス名を入力する。入力には、図22(a)に示すように、セルを選んでプルダウンメニューからクラス(ここではInteger, Double, String)を選ぶか、キーボードで直接タイプする。
注意:システムは、トークンとして認識した文字列(String オブジェクト)をコンストラクターの引数として初期化するクラスのみをサポートする。それ以外のクラスについては、字句解析仕様の決定の過程においてコード編集する必要がある。simple calc においては、「ID が、変数名を表すString 型」、「NUMBER が、数値を表すDouble型」を持つ。これで、トークンの定義は完了する。図22(b)に入力の結果を示す。
4.2.2 字句解析状態を定義ここでは、字句解析状態を定義する。定義には、メインウインドウの上段中央に配置されている字句解析状態プール(図23(a))を使用する。このプールには、初期状態としてYYINITIALが登録されている。必要ならば、他の状態を追加する。また、状態YYINITIALは、削除することができない。simple calc においては、字句解析状態がコメントの中であることを表すCOMMENT が追加される。図23(b)は、字句解析状態を入力した結果を示す。
4.2.3 字句解析仕様の決定字句解析仕様を決定する。メインウインドウの左下に配置されている字句解析デザインテーブル(図24)を使用する。入力すべき項目は、パターン、トークン名、現在の字句解析状態、そして次の字句解析状態である。
パターン:字句解析パターンを、"パターン"の列に、正規表現を用いて入力する。入力の際に、テーブルのセルをダブルクリックすると、字句解析パターンプールと共に、入力用のテキストフィールドが現れる。目的のパターンがプールにあればそれを選び、もしなければ直接キーボードで入力する。字句解析パターンプールは、標準的なパターンが予め登録されたものである(図25(a)参照)。
注意:字句解析には優先順位が存在する。優先度の高い順に上から入力する。また、システムはアルファベットの大文字、小文字を区別しない。もし、区別させたいのなら、字句解析仕様ソースコードのテンプレートを編集する。編集の方法は生成コードのカスタマイズ(第5章)を参照されたい。simple calc において必要なパターンを優先度の順に並べると、以下のようになる。
1.予約語: "for", "printf"2.演算子: "+", "-", "*", "/", "="3.括弧: "(", ")", "{", "}"4.セパレータ: ";"5.数値(0 以上の実数): [0-9]+("."[0-9]*)?6.識別子: [A-z][A-z0-9]*7.コメントの始まり、中身、終り: "/*", ([^*/])*, "*/"8.空白、改行: [\ \t\b\n]以上のパターンを入力した結果を図25(b)に示す。
トークン名:各パターンに対応するトークンを決定する。"トークン名"の列に対して、トークンプールに登録されたトークンから一つを選ぶ形で入力する。また、対応するトークンが存在しないパターンについては、空欄にしておく。simplecalc においてパターンにトークンを割り当てた結果を図26に示す。空白、改行、そしてコメントの始まりと終りに対しては空欄になっている。
始まりの字句解析状態:各パターンを認識する際の始まりの字句解析状態を決定する。"状態"の列に入力する。また、何も指定がない場合は、初期状態であるYYINITIAL からの開始になる。simple calc においては、コメントの中のパターン[["*/"] ]^*とコメント終りのパターン"*/"は、状態COMMENT からの開始となる。
次の字句解析状態:各パターンを認識した後の字句解析状態の移動を決定する。"次の状態"の列に入力する。また、何も指定がない場合は、字句解析状態の移動を行わない。simple calc においては、パターン"*/"で、初期状態YYINITIAL に戻り、そしてパターン"/*"で状態COMMENT へ移動する。図27に字句解析仕様の決定を完了した結果を示す。
【0019】ここで、前記と若干重複するが、本発明の字句解析ルール入力システムと対応してさらに説明する。この実施形態のシステムでは、図28に概念的に示したように、字句解析パターンとトークンとの対応付けを行っている。ここでは、字句解析パターンに対応して選択されるべきトークンのメニューすなわちリスト(この例では、トークンテーブルに含まれる全てのトークン)が、操作者に選択可能なように表示される。操作者は、リストから、所望のトークンを指定することにより、トークンの入力を行うことができる。また、この例では、パターンの入力においても、パターンのメニューが画面に示されて、選択による入力ができるようになっている。本例では、文法要素とは独立(従属して定義されていないことを意味する。)して形成されたトークンテーブルを用いているので、字句解析パターンとトークンとの対応付けが容易となるという利点がある。
4.3 構文解析モジュールの設計構文解析モジュールとは、図29に示すように、字句解析モジュールから受け取ったトークンの列から、VM における実行コードであるVM インストラクションツリーを作り出すモジュールである(正確には、トークンの列から構文解析木を作ることが構文解析であるが、このシステムの構文解析モジュールは、セマンティックマッピングも構文解析と同時に行う。)。この章では、この構文解析モジュールにおける、構文解析のルーチンをどのようにして設計するかについて説明する。構文解析ルーチンのもう一つのルーチンであるセマンティックマッピングについては、次の章で説明する。ここで、構文解析仕様を設計するということは、ソースプログラムのトークンを終端記号に持つ文法を定義することにあたる。つまり、文法を用いてプログラムの正しい構築ルールを表す。このシステムにおいては、以下の手順で文法の入力を行う。
1.文法要素の定義2.生成規則の決定4.3.1 文法要素の定義まず、文法要素を決定する。文法要素には、終端記号と非終端記号の二種類がある。しかし、終端記号は字句解析の設計において入力されたトークンなので、ここで入力するのは非終端記号のみである。入力には、メインウインドウの右上にある文法要素プール(図30(a))の"文法要素"の列を使う。セルを選択した後、文法要素名をタイプする。この文法要素プールには、文法要素START が始めから登録されている。入力する文法には、この記号を開始記号として必ず使うこととなっている。また、このSTART を削除することはできない。simple calc において、必要な文法要素には以下のものがある。
・ 式: expr・ 処理: seq・ 処理の集まり: block以上を入力した結果を図30(b)に示す。
4.3.2 文法の生成規則の決定これまでに定義したトークンと文法要素を用いて、文法の生成規則を決定する。入力には、メインウインドウの右下にある文法要素プール(図31(a))を使う。図31(b)に示すように、生成規則の左辺は"目的文法要素"の列にタイプもしくはプルダウンメニューから選択することで入力する。右辺の入力は"文法要素列"の列をダブルクリックするとダイアログがポップアップするので、そこに入力する。図31(c)を参照されたい。また、このダイアログにおいての空欄は無視される。simple calc において、生成規則には、図32に示すものがある。これらの規則を入力した結果を図31(d)に示す。ここで、図中二番目の生成規則についてであるが、この規則は、seq を、SEMI をセパレータとして連続で生成する規則である。システムはこのタイプの規則を自動で構成することができる。自動生成の指定は、セマンティックマッピング時に行われるので、ここでは、この規則に登場する二つの要素であるseq とSEMI を入力しておく。また、この自動で構成された規則は、セマンティックマッピング時において、連続生成された要素をひとまとまりのブロックとしてフラットに扱う事ができる。詳しくは、次の章を参照されたい。
【0020】ここで、前記と若干重複するが、本発明の構文解析ルール入力システムと対応させてさらに説明する。図31の(b)と(c)とを併せて簡略に記載すると、図33のようになる。左側の枠に左辺文法要素、右側の枠に右辺文法要素が入力される。したがって、この実施形態は、「左辺文法要素と右辺文法要素とを規定することにより、構文解析ルールを、コンピュータを用いて入力する構文解析ルール入力システムにおいて、前記左辺文法要素および/または右辺文法要素となる文法要素またはトークンを操作者に選択させるためのメニューを、操作者に認識可能なように表示させる」ものである。
【0021】さらに、選択のためのメニューを供給する方式について、図34を用いて説明する。前記したとおり、予め、文法要素テーブル(プール)とトークンテーブル(プール)とを入力しておく。これらは互いに独立(相互従属性がない)となっている。これらを用いて、選択のためのメニューを表示させることができる。したがって、この実施形態は、「左辺文法要素と右辺文法要素とを規定することにより、構文解析ルールを、コンピュータを用いて入力する構文解析ルール入力システムにおいて、互いに独立させられたトークンテーブルと文法要素テーブルとを備えており、前記左辺文法要素および/または右辺文法要素となる文法要素またはトークンを操作者に選択させるためのメニューを、前記トークンテーブルまたは文法要素テーブルに含まれるトークンまたは文法要素のデータを用いて、操作者に認識可能なように表示させる」システムとなっている。
4.4 セマンティックマッピング(図35)
構文解析ルーチンの中では、文法の各生成規則が還元される際に、VM インストラクションツリーの一部が生成されていく。このシステムにおけるセマンティックマッピングとは、各生成規則に対して生成されるVM インストラクションサブツリーを指定することである。ここで、このシステムが生成する言語処理系のマシンコードであるVM インストラクションツリーの実行方法について簡単に説明する。このシステムが提供するVM とは、java のメソッドの集まりである。そして、このVM は受け取ったツリーを、再帰ルーチンを用いて深さ優先に探索し、命令の情報を持つノードに基づき、ツリーの葉から順に実行していく。セマンティックマッピングでは、図2の右下の構文解析デザインテーブルにある"セマンティクス"の列に入力する。対応する文法のセルをダブルクリックすると、セマンティックマッピングダイアログが開く。図36にこのダイアログの初期状態を示す。マッピングする対象には大きく分けて以下の三種類がある。
・ VM 命令・ キャスト命令・ システム命令4.4.1 VM 命令へマッピングある生成規則をVM 命令に対してマッピングすると、構文解析の際に、その生成規則が還元された時、その命令の為のVM インストラクションサブツリーを生成することになる。図37に、足し算のVM インストラクションにマップされたときに生成されるサブツリーの例を示す。このサブツリーのルートノードが、還元されるシンボルにあたる。入力するデータは、VM 命令とその引数である。引数には、生成規則の右辺の文法要素から選ぶ。また、引数に指定可能なのは、文法要素のうちの非終端記号のみ(文法要素プールに登録した記号)である。値をもつトークンに対しては、VMインストラクションツリーのノードとしてキャストされてある必要がある。詳しくは、次の項目「キャスト命令へマッピング」を参照されたい。入力には、まずVM インストラクションをリストから選択する。図38を参照されたい。次に、引数をプルダウンメニューから選択する。右辺の文法要素(expr, PLUS, expr)は、右から順に、$1,$2,$3のように番号付けされている。図39を参照されたい。ここでは、引数となる数値1と数値2に対して$1と$3のどちらを割り当てるかで、計算順序が指定される。$2は加算記号なので指定する必要がない。simple calc においては、四則演算の生成規則に対するマッピングがこの種類の操作になる。例えば、足し算のマッピングを完了した結果は、図40のようになる。他の三つに対しても、同様にマッピングを行う。
4.4.2 キャスト命令へマッピング前節でも述べたように、文法の終端記号であるトークンを、直接VM インストラクションの引数とすることはできない。トークンの持つ値であるjava オブジェクトを、VM が提供する型へ変換(キャスト)しなければならない。図41に、String の値を持つトークンを小数型識別子としてキャストするVM インストラクションサブツリーを、例として示す。入力には、まずリストから値の型を選択する。そして、その値の型へキャストするトークンを生成規則の右辺から選択する。図42と図43を参照されたい。simple calc においては、ID とNUMBER を、expr へ還元する規則に対して、この種類のマッピングを行う。ID は小数型識別子、NUMBER は定数へそれぞれキャストする。図44に、expr → ID の生成規則に対し、マッピングを完了した結果を示す。
4.4.3 メイン命令とサブ命令前の2節では、一つの生成規則をVM が提供する命令一つだけにマッピングする方法を説明した。ここでは、より複雑なマッピングを行う。例えば、simple calc においては、代入演算を還元する規則をマッピングする際、まずトークンであるID を小数型識別子にキャストし、それから代入演算にマッピングしなければならない。つまり、図45に示すような、VM インストラクションサブツリーを作らなければならない。このようなマッピングを行うために、このシステムでは、マッピングする命令を階層化することがでる。ここで、還元されるノードを持つ命令を"メイン命令"、そして、それ以外の命令を"サブ命令"と呼ぶことにする。入力の手順を順番に説明する。まずサブ命令を追加する。そのために、"サブ命令を追加"ボタンを押す。図46に、サブ命令を追加した結果を示す。このサブ命令は幾つでも作ることができる。そして、サブ命令に対して、更にサブ命令を付ける事も可能である。サブ命令にサブ命令を付ける場合には、サブ命令を付けたい命令を選択した後、追加ボタンを押せばよい。また、サブ命令を削除したいときには、命令を選んで"命令削除"ボタンを押す。次に、サブ命令の内容を決定する。simle calc においては、図47に示すように、トークンID を小数型識別子にキャストする命令を指定する。次に、メイン命令の内容を決定する。図48に示すように、メイン命令の引数として、サブ命令が指定できる。これにより、サブ命令の実行結果をメイン命令の引数とする事ができる。また、サブ命令は上から順番に番号が振られる。simple calc においては、図49に示すように、命令に代入演算を指定する。また、繰り返し文に対しても、このタイプのマッピングを行う。図50を参照されたい。この場合、必要になるサブ命令は二つになる。
4.4.4 システム命令へマッピングここでは、その他として、VM のタイプに依存しない命令、つまりシステムが固有で持つ命令に対するマッピングについて説明する。
何もせずに還元:何も処理をしないで、右辺の文法要素から一つを選択して、還元する命令である。この命令は、メイン命令としてのみ選択が可能となっている。simple calc においては、expr → LPAREN expr RPAREN に対して、この命令をマッピングする。図51にマッピングの結果を示す。
連続生成してブロック化:プログラミング言語の構造を表す文法においては、ある文法要素を任意の回数だけ生成する規則はたいてい必要になる。このような文法は、正規文法なので簡単に作ることが可能だが、還元する際に、ツリーがどんどん縦に延びてしまい、本来フラットな構造であるこの規則を扱うには多少の困難が発生する。そこで、この実施形態のシステムでは、このタイプの文法を自動で生成し、還元されたシンボルをフラットなデータとして扱うルーチンを自動で生成することを可能としている。このルーチンを使うには、まず構文解析仕様の決定のステップにおいて、生成規則の右辺に対して、連続生成される文法要素とセパレータとなる文法要素を指定する。そして、このセマンティックマッピングのステップにおいて、この命令を選択する。引数には、セパレータと連続生成する文法要素を指定する。この規則が還元された際には、図52に示すように、連続生成した文法要素をフラットな子ノードとして持つVM インストラクションサブツリーが還元される。また、この命令もメイン命令としてのみ指定可能である。simple calc においては、SEMI をセパレータとして、seq を任意の数だけ生成して、block に還元する。図53にマッピングの結果を示す。
VM ツリーのルートに設定:右辺の文法要素の中から一つを選択して、VM インストラクションツリーのルートノードに設定する命令である。ほとんどの場合は、開始記号であるSTART に還元する生成規則に対して、この命令をマッピングすることになると考えられる。VM は、このルートノードから深さ優先に探索して、命令ノードを実行していく。また、この命令もメイン命令のみマッピングの対象となる。simple calc においても、START → block の生成規則に対してこの命令をマッピングする。図54を参照されたい。
【0022】ここで、前記と若干重複するが、本発明のセマンティックマップ入力システムと対応してさらに説明する。図55に示されるように、前記した実施形態では、選択された一つのVMインストラクションにおける引数n(nは自然数であり、その最大値はインストラクションによって決まる)に文法要素またはトークンを入力する。この入力においては、引数nを選択すると、画面には、取りうる文法要素またはトークンを示すメニューが表示される。使用者は、このメニューから文法要素またはトークンを選択することで入力ができる。したがって、入力における誤りが少なくなり、入力操作も簡単になるという利点がある。前記したセマンティックマップ入力システムは、「インストラクションリストと、右辺文法要素テーブルと、トークンテーブルとを備えており、前記インストラクションリストから選択されたインストラクションにおいて引数として取りうる文法要素またはトークンが、前記右辺文法要素テーブルまたはトークンテーブルから、コンピュータにより選択され、かつ、このように選択された文法要素またはトークンから操作者が選択を行うためのメニューを操作者に認識可能なように表示させる」システムとなっている。
4.5 言語処理系を生成セマンティックマッピングまで終了すれば、言語処理系を生成するためのデータは全て入力したことになる。ここで、言語処理系の仕様が記述してあるjava cupとJFlexのコードを生成し、コンパイルを行う。コンパイルには、java のコマンド群を使用する。図56に示すように、メニューの"編集"から、"プロパティ"を選んで、java/bin/のディレクトリを指定する。java コマンドの場所を指定したら、"ビルド"ボタン(図2左上参照)を押す。コンパイル終了後に、図57に示すように、コンパイルの結果が表示される。なお、最初の一回目のビルド時には、VM のコンパイルも同時に行われるので、時間がかかる。ビルドに成功したら、テストGUI で言語処理系の動作を確かめる。プロジェクト用ディレクトリの中にあるRESULT と名前の付いたディレクトリに移動して、コマンドラインから% java Mainを入力する。これによりテストGUI が起動する。また、起動するテストGUI は、選択したVM により異なる。
4.5.1 汎用VM 用テストGUIVM に汎用VM を選んでいる場合には、図58に示す、GUI が起動する。中央のテキストエリアにソースコードを入力して、コンパイルボタンを押すとコンパイルができる。また、コンパイル成功後に実行ボタンを押せば、コードが実行できる。図59を参照されたい。画面下側のコンポーネントが、標準出力である。終了には、終了ボタンを押す。また、このGUI には、汎用VM が提供する内部処理過程表示ビューアが配置されている。左端が変数ブラウザ、右端がコードビューアである。
4.5.2 テーブル処理VM 用テストGUIテーブル処理VM を選んでいる場合には、図60に示すGUI が起動する。中央のパネルがシートである。また、左がグラフパネル、そして右がコピーバッファビューアである。コードの入力は、コマンドラインから行う。図61のように、汎用VM の時と違い、言語処理系は一行毎にコンパイルと実行を逐次行う。
4.5.3 テキストVM 用テストGUIテーブル処理VM を選んでいる場合には、図62に示すGUI が起動する。左のパネルはテキストを表示するためのパネル、右の三つのパネルはコピーバッファビューアである。コードの入力は、コマンドラインから行う。図63のように、テーブル処理VMと同様に、言語処理系は、一行毎にコンパイルと実行を逐次行う。
【0023】第5章 生成コードのカスタマイズこの章では、GUI が生成するコードを直接カスタマイズする方法を説明する。また、生成コードはjava で記述されているので、コードのカスタマイズは、java 言語を習得している人のみ可能である。デザインシステムのGUI から、カスタマイズ可能なコードは以下の種類がある。
・ 字句解析モジュールアクションコード字句解析モジュールにおいて、各パターンにソースコードの入力がマッチした際に、実行されるコードである。
・ 構文解析モジュールアクションコード構文解析モジュールにおいて、文法の各生成規則が還元された際に、実行されるコードである。
・ JFlex コードのテンプレート字句解析モジュールコードのテンプレートである。字句解析モジュールコードの最初にインライン展開される。
・ java cup コードのテンプレート構文解析モジュールコードのテンプレートである。構文解析モジュールコードの最初にインライン展開される。また、システム生成したコードはプロジェクトのディレクトリの中にあるRESULT に、プロジェクト名.cup とプロジェクト名.flex として存在するので、直接テキストエディタで編集することも可能である。
注意:この方法でカスタマイズを行ったら、システムのビルド機能は使用しないようにする。システムに上書きされてしまうためである。
5.1 字句解析モジュールアクションコードのカスタマイズ字句解析デザインテーブルにおいて、アクションコードをカスタマイズしたいパターンを選択した後、"コード編集"ボタンを押す。図64に示すように、コード編集用のダイアログが開く。また、コードがカスタマイズ可能なのは、パターンが決定された後である。このダイアログには、システムが自動生成したアクションコードとパターンが表示される。編集可能なのは、アクションコードのみである。
注意:コードがカスタマイズされたパターンについては、カスタマイズ後のトークン名やパターンの変更は無視される。コードのカスタマイズは最後に行うことが推薦される。
5.2 構文解析モジュールアクションコードのカスタマイズ構文解析デザインテーブルにおいて、アクションコードをカスタマイズしたい生成規則を選択した後、"コード編集"ボタンを押す。図65に示すように、コード編集用のダイアログが開く。また、コードがカスタマイズ可能なのは、生成規則に対してセマンティックマッピングが行われた後である。このダイアログには、システムが自動生成したアクションコードと文法の生成規則が表示される。編集可能なのは、アクションコードのみである。ここで、生成規則の右辺の文法要素には、各文法要素が持つ値であるjava オブジェクトを扱うために、識別子が割り当てられている。このシステムにおいては、右から順にE1, E2,...となっている。これを変更することはできない。また、文法要素が持つjava オブジェクトのクラスは、終端記号であるトークンならトークンプールに指定したクラス(指定がなければマッチしたパターンのString)になる。非終端記号においてはVM インストラクションツリーのNode クラスになる。もし、Node クラス以外の値をとらせたいのなら、文法要素プールの"クラス"の列に入力を行う。
注意:カスタマイズされたコードを持つ生成規則の、セマンティックマッピングを変更すると、カスタマイズは無効になる。コードのカスタマイズは最後に行うことが推薦される。
5.3 JFlex コードのテンプレートのカスタマイズ編集メニューから、"テンプレート編集"の"jflex template"を選択する。図66に示すように、コード編集用のダイアログが開く。JFlex のディレクティブなどが変更できる。
5.4 java cup コードのテンプレートのカスタマイズ編集メニューから、"テンプレート編集"の"java cup template"を選択する。図67に示すように、コード編集用のダイアログが開く。エラーメッセージなどが変更できる。
【0024】第6章 GUIを作成この章では、システムが生成した言語処理系の上にGUI を載せる方法を説明する。GUIは、java 言語を用いて記述することになるので、前章の生成コードのカスタマイズと同様に、java 言語を習得されている人のみ可能である。
6.1 ソースコードのコンパイルデザインシステムにより作成された言語処理系のクラスにおける、ソースプログラムのコンパイルと命令の実行の流れを図68に示す。この図において、クラスYylexとParser は、それぞれ字句解析と構文解析モジュールである。また、クラスVM は、汎用VM(General VM)、テーブル処理VM(TableVM)、そして、テキストVM(TextVM)のいずれかに相当する。クラスGUI は、これから作成されるGUI を指す。クラスYylex とParser によるソースコードからの実行コード(VM インストラクションツリー)生成の流れは、どのVM を選んでも同じである。以下に、手順をまとめる。
1.クラスParser を初期化2. Parser のメソッドsetInput によりソースコードをコンパイル3. Parser のメソッドgetParserTree によりVM インストラクションツリーを取得ここで、初期化操作(操作1)は初めの1 回目のみで、操作2 と3 を繰り返し行うことができる。また、クラスYylex は、Parser が管理しているので、普通に言語処理系を使用する際には、GUI からの直接の操作は必要ない。つまり、GUI側では、Parser クラスのみの操作で実行コードをソースコードから作成できる。また、VM への意味実行の操作は、各VM ごとに少しずつ異なるので、それぞれ分けて説明する。以下にシステムが自動生成する構文解析モジュール(クラスParser)の仕様をまとめる。
構文解析モジュールクラス仕様(class parser)・ parserpublic parser()コンストラクタである。
・ setInputpublic void setInput(InputStream input)input を渡して、コンパイルを行う。
・ getParseTreepublic Node getParseTree()コンパイルで生成されたVM インストラクションツリーのルートノードを獲得する。
・ setIOpublic void setIO(JTextArea io)コンパイルエラーを表示するためのテキストエリアをセットする。(もし、テキストエリアがセットされてなければ、コンパイラは標準出力にエラーを表示する。)6.2 汎用VM 用GUI汎用VM におけるVM インストラクションの実行は、全て汎用VM コントローラクラス(VMController)を通して間接的に行われる。VM に対して直接操作する必要はない。また、内部過程処理表示ビューアも、このクラスのインスタンスを通して所得できる。以下に汎用VM コントローラの仕様をまとめる。
汎用VM コントローラクラス仕様(class VMController)・ VMControllerpublic VMController()コンストラクタである。VM を動かすために必要なオブジェクトは全て初期化される。
・ getVariableViewerpublic JComponent getVariableViewer()変数ビューアを獲得する。
・ getVMTreeViewerpublic JComponent getVMTreeViewer()コードビューアを獲得する。
・ getStdiopublic JComponent getStdio()VM の標準入出力を獲得する。
・ setProgrampublic void setProgram(Node program)VM インストラクションツリーのルートノードをVM にセットする。実行は行わない。
・ runProgrampublic void runProgram()セットされているVM インストラクションツリーを実行する。
・ stopRunpublic void stopRun()実行中の処理を一時停止する。
・ restartRunpublic void restartRun()一時停止中の処理を再開する。
・ isRunningpublic boolean isRunning()VM が命令を実行中であればtrue を返す。それ以外はfalse を返す。
・ stepRunProgrampublic void stepRunProgram()セットされているVM インストラクションツリーのステップ実行を開始する。
・ nextSteppublic void nextStep()ステップ実行のステップを次に進める。
・ clearVMpublic void clearVM()セットされているプログラムをクリアする。VM は起動時の状態に戻る。
・ getErrorpublic int getError()最後にVM で発生した実行エラーのid を獲得する。獲得されたエラーはクリアされる。
・ isThereErrorpublic boolean isThereError()エラーが発生したならtrue を、それ以外ならfalse を返す。
6.3 テーブル処理VM 用GUIテーブル処理VM には、処理は逐次実行されるため、汎用VM の場合と違い、処理の一時停止やステップ実行がない。従って、VM インストラクションの実行の操作は直接VM に対して行う。実行の手順を以下にまとめる。
1.テーブル処理VM コントローラクラス(TableVMController)を初期化2. TableVMController のメソッドgetVM でTableVM のインスタンスを取得3. TableVM のinterpritVMTree を、VM インストラクションツリーを引数として実行また、内部処理過程表示ビューア(コピーバッファビューア)はTableVMVM クラスを通して取得する。以下にテーブル処理VM コントローラの仕様をまとめる。
テーブル処理VM コントローラクラス仕様(class TableVMController)・ TableVMControllerpublic TableVMController()コンストラクタである。テーブル処理VM を起動するのに必要なオブジェクトは全て初期化される。
・ getVMpublic TableVM getVM()テーブル処理VM のオブジェクトを所得する。
・ getVMVMpublic TableVMVM getVMVM()テーブルVMVM のオブジェクトを所得する。以下はテーブル処理VM の仕様である。
テーブル処理VM クラス仕様(class TableVM)・ setGUIpublic void setGUI(VMDataReceiver gui)gui をテーブル処理VM の処理したデータの受取り先に指定する。
・ setParserpublic void setParser(parser parser obj)VM は、ファイル操作時にファイル内容をオートでコンパイルする。そのためにparser obj をVM にセットする。また、このメソッドを通じてコンパイラをVMに指定しないと、VM のファイル操作機能は作動しない。
・ interpritVMTreepublic boolean interpritVMTree(Node program)program をVM に渡して、実行する。もし、実行時にエラーが発生した場合には、false を返す。また、正常にprogram が実行された場合には、true を返す。以下はテーブルVMVM の仕様である。
テーブルVMVM クラス仕様(class TableVMVM)・ getCutBufferViewerpublic JTable[] getCutBufferViewer()コピーバッファビューアを所得する。テーブル処理やテキスト編集の際には、GUI はVM によって更新されたデータを受け取って表示しなければならない。そのため、VM からGUI に対してデータの変更を通知する手段が必要である。このシステムのテキストVM とテーブル処理VM は、これを以下の方法により実現している。VM 側は、データ更新のメソッドが定義されたインターフェイスを提供する。そして、GUI 側でこのインターフェイスを実装する。このインターフェースをVMDataReceiever と呼ぶ。以下に仕様をまとめる。
VM データレシーバインターフェイス仕様(interface VMDataReceiever)・ STRONGpublic static final int STRONGフォーカスや矢印の強調度が強いことを意味する。
・ MIDDLEpublic static final int MIDDLEフォーカスや矢印の強調度が中程度であることを意味する。
・ WEAKpublic static final int WEAKフォーカスや矢印の強調度が弱いことを意味する。
・ inputCellDatapublic void inputCellData(String sheetname, int row, int col-umn,Stringdata)セルの値が更新された際に呼ばれる。更新内容、シート名、そしてセル番地を引数にとる。
・ inputCellFunctionpublic void inputCellFunction(String shttename, int row, intcolumn, String function)セルの式の値が更新された際に呼ばれる。
・ focusCellpublic void focusCell(String sheetname, int row, int column,int type)検索の結果や参照の対象のセルを表示する際に呼ばれる。また、引数type は、強調度である。
・ focusRegionpublic void focusRegion(String sheetname, int row1, int col-umn1,int row2, int column2, int type)参照の対象のセル領域を表示する際に呼ばれる。
・ drawArrowToCellpublic void drawArrowToCell(String from sheetname, int from row,int fromcolumn, String to sheetname, int to row, int to column,int type)セルへの参照の矢印を表示する際に呼ばれる。
・ drawArrowToRegionpublic void drawArrowToRegion(String from sheetname, int from row,int from column, String to sheetname, int to row1, int to column1,int to row2,int to column2, int type)セル領域への参照の矢印を表示する際に呼ばれる。
・ clearFocuspublic void clearFocus()フォーカスや矢印を消す際に呼ばれる。
・ setVisualCommandspublic void setVisualCommands(VisualCommand[] commands)内部処理過程を表示するためのコマンド列を受け取る。
・ setPreviousValuespublic void setPreviousValues(ChangeDataCommand[] commands)テーブル処理を行う前の更新データをセットするコマンドを受け取る。
・ setCurrentValuespublic void setCurrentValues(ChangeDataCommand[] commands)テーブル処理を行った後のデータをセットするコマンドを受け取る。
・ setErrorMessagepublic void setErrorMessage(String message)エラーが発生した際にエラーメッセージを引数に呼ばれる。
・ setCurrentCellEditorpublic void setCurrentCellEditor(String function)命令"CALL"を実行したセルの式を引数に呼ばれる。また、テーブル処理VM では、内部処理過程表示のためのデータもVMDataReceieverを通じて行われる。このデータはコマンドオブジェクトの配列であり、これらのコマンドには、以下のような種類がある。GUI 作成者はこれらのコマンドに対して、自由に内部処理の表示方法を割り当てる事ができる。
abstract class VisualCommand解説全てのコマンドの抽象親クラスである。
class ChangeDataCommand解説指定のセル番地のデータを更新する。
・ getDatapublic String getData()更新データを取得する。
・ getSheetNamepublic String getSheetName()更新されたセルを持つシート名を取得する。
・ getRowIndexpublic int getRowIndex()更新されたセルの行のインデックスを取得する。
・ getColumnIndexpublic int getColumnIndex()更新されたセルの列のインデックスを取得する。
class DrawMessageCommand解説内部処理過程の解説文を表示する。
・ getMessagepublic String getMessage()メッセージを取得する。
class ClearCommand解説描画データを消す。
class FocusCellCommand解説セルをフォーカスする。
・ getSheetNamepublic String getSheetName()フォーカスされるセルを持つシート名を取得する。
・ getRowIndexpublic int getRowIndex()フォーカスされるセルの行インデックスを取得する。
・ getColumnIndexpublic int getColumnIndex()フォーカスされるセルの列インデックスを取得する。
・ getTypepublic int getType()フォーカスの強調度を取得する。
class FocusRegionCommand解説セル領域をフォーカスする。
・ getSheetNamepublic String getSheetName()フォーカスされるセル領域を持つシート名を取得する。
・ getStartRowIndexpublic int getStartRowIndex()フォーカスされるセル領域の始まりの行インデックスを取得する。
・ getStartColumnIndexpublic int getStartColumnIndex()フォーカスされるセル領域の始まりの列インデックスを取得する。
・ getEndRowIndexpublic int getEndRowIndex()フォーカスされるセル領域の終りの行インデックスを取得する。
・ getEndColumnIndexpublic int getEndColumnIndex()フォーカスされるセル領域の終りの列インデックスを取得する。
・ getTypepublic int getType()フォーカスの強調度を取得する。
class DrawArrowToCellCommand解説セルからセルへ矢印を描く。
・ getStartSheetNamepublic String getStartSheetName()矢印の始まりのセルを持つシート名を取得する。
・ getEndSheetNamepublic String getEndSheetName()矢印の終りのセルを持つシート名を取得する。
・ getStartRowIndexpublic int getStartRowIndex()矢印の始まりのセルの行インデックスを取得する。
・ getStartColumnIndexpublic int getStartColumnIndex()矢印の始まりのセルの列インデックスを取得する。
・ getEndRowIndexpublic int getEndRowIndex()矢印の終りのセルの行インデックスを取得する。
・ getEndColumnIndexpublic int getEndColumnIndex()矢印の終りのセルの列インデックスを取得する。
・ getTypepublic int getType()矢印の強調度を取得する。
class DrawArrowToRegionCommand解説セルからセル領域に矢印を描く。
・ getStartSheetNamepublic String getStartSheetName()矢印の始まりのセルを持つシート名を取得する。
・ getEndSheetNamepublic String getEndSheetName()矢印の終りのセルを持つシート名を取得する。
・ getStartRowIndexpublic int getStartRowIndex()矢印の始まりのセルの行インデックスを取得する。
・ getStartColumnIndexpublic int getStartColumnIndex()矢印の始まりのセルの列インデックスを取得する。
・ getEndRowIndex1public int getEndRowIndex1()矢印の終りのセルの始まりの行インデックスを取得する。
・ getEndColumnIndex1public int getEndColumnIndex1()矢印の終りのセルの始まりの列インデックスを取得する。
・ getEndRowIndex2public int getEndRowIndex2()矢印の終りのセルの終りの行インデックスを取得する。
・ getEndColumnIndex2public int getEndColumnIndex2()矢印の終りのセルの終りの列インデックスを取得する。
・ getTypepublic int getType()矢印の強調度を取得する。
class PauseCommand解説内部処理過程表示の区切りの命令である。一時停止する。
6.4 テキストVM 用GUIテキストVM には、処理は逐次実行されるため、汎用VM の場合と違い、処理の一時停止やステップ実行がない。従って、VM インストラクションの実行の操作は直接VM に対して行う。実行の手順を以下にまとめる。
1.テキストVM コントローラクラス(TableVMController)を初期化2. TextVMController のメソッドgetVM でTextVM のインスタンスを取得3. TextVM のinterpritVMTree を、VM インストラクションツリーを引数として実行また、内部処理過程表示ビューアはTextVMVM クラスを通して取得する。以下にテキスト処理VM コントローラの仕様をまとめる。
テキストVM コントローラクラス仕様(class TextVMController)・ TextVMControllerpublic TextVMController()コンストラクタである。テキストVM を起動するのに必要なオブジェクトは全て初期化される。
・ getVMpublic TextVM getVM()テキストVM のオブジェクトを所得する。
・ getVMVMpublic TextVMVM getVMVM()テキストVMVM のオブジェクトを所得する。
以下はテキストVM の仕様である。
テキストVM クラス仕様(class TextVM)・ setGUIpublic void setGUI(VMDataReceiver gui)gui をテキストVM の処理したデータの受取り先に指定する。
・ interpritVMTreepublic boolean interpritVMTree(Node program)program をVM に渡して、実行する。もし、実行時にエラーが発生した場合には、false を返す。また、正常にprogram が実行された場合には、true を返す。以下はテキストVMVM の仕様である。
テキストVMVM クラス仕様(class TableVMVM)・ getCutBufferViewerpublic JTable[] getCutBufferViewer()カットバッファビューアを所得する。テキスト処理やテキスト編集の際には、GUI はVM によって更新されたデータを受け取って表示しなければならない。そのため、VM からGUI に対してデータの変更を通知する手段が必要である。このシステムのテキストVM とテキスト処理VM は、これを以下の方法により実現している。VM 側は、データ更新のメソッドが定義されたインターフェイスを提供する。そして、GUI 側でこのインターフェイスを実装する。このインターフェースをVMDataReceiever と呼ぶ。以下に仕様をまとめる。
VM データレシーバインターフェイス仕様(interface VMDataReceiever)・ setTextpublic void setText(int buffer id, String text, Color[] color,float[] size)buffer id 番のテキストバッファの内容に変更があった際に呼ばれる。変更後のテキストは、text 、また、color とsize はそれぞれテキストの文字の色とサイズである。
・ setCaretpublic void setCaret(int buffer id, int position)buffer id 番のテキストバッファのカレットの位置に変更があった際に呼ばれる。カレットの位置は、position 番目の位置になる。
・ setErrorMessagepublic void setErrorMessage(String message)エラーが発生した際にエラーメッセージを引数に呼ばれる。
【0025】第7章 VM インストラクションここでは、各VM の命令を詳細に説明する。
7.1 汎用VM表1に、汎用VM命令の一覧を示す。
【表1】

・ VM 命令: ABS引数:数値1説明: [数値1]の絶対値・ VM 命令: ACOS引数:数値1説明:角度([数値1]の逆余弦・ VM 命令: AND引数:ブール値1,ブール値2説明:[ブール値1]&&[ ブール値2]・ VM 命令: ASIN引数:数値1説明:角度([数値1])の逆正弦・ VM 命令:ATAN引数:数値1説明:角度([数値1])の逆正接・ VM 命令:BACK_COLOR引数:数値1,数値2,数値3説明:背景の色をRGB([ 数値1],[数値2],[数値3])に設定・ VM 命令:BACK_COLOR16引数:数値説明:背景の色を、次の16色から[数値]で選択し設定([0] 黒,[1] 青,[2] 赤,[3]マゼンダ,[4] 緑,[5] シアン,[6] 黄,[7] 白,[8] 銀,[9] 暗い青,[10] 暗い赤,[11] 暗いマゼンダ,[12] 暗い緑,[13] 暗いシアン,[14] 暗い黄,[15] 灰)・ VM 命令: BELL説明:ベルを鳴らす・ VM 命令: CIRCLE引数:数値1,数値2,数値3説明:中心([数値1],[数値2]半径[数値3])の円を描く・ VM 命令: CIRCLE_IMAGE引数:数値1,数値2,数値3,数値4説明:中心([数値1],[数値2])半径[数値3]の円を[数値4]番目のイメージに描く・ VM 命令: CLEAR IMAGE引数:数値1説明: [数値1]番目のイメージの絵を消す・ VM 命令: CLS説明:スクリーンの文字を消す・ VM 命令: COS引数:数値1説明:角度([数値1])の余弦・ VM 命令: CREATE_IMAGE引数:文字列,数値説明:画像ファイル([文字列])を[数値]番目のイメージとする・ VM 命令: CREATE_IMAGE引数:数値1,数値2,数値3説明:横([数値1])縦([数値22])のサイズのイメージを新しく作って[数値3]番目のイメージとする・ VM 命令: CREATE_IMAGE引数:数値1,数値2,数値3,数値4,数値5説明:グラフィクスウィンドウから([数値1],[数値2])から([数値3],[数値4])までを切り取って[数値5]番目のイメージとする・ VM 命令:DATE説明:今日の日付・ VM 命令: DEC引数:数値説明: [数値](16進数)を10進数に変換・ VM 命令: DIM引数:変数,数値説明:配列([変数])を大きさ([数値])で作る・ VM 命令: DIVID引数:数値1,数値2説明: [数値1]÷[数値2]VM 命令:DOT引数:数値1,数値2説明:中心([数値1],[数値2]]に点を打つ・ VM 命令:DOT_IMAGE引数:数値1,数値2,数値3説明:中心[([数値1],[数値2]に点を[数値3]番目のイメージに打つ・ VM 命令: DOUBLE_ASIGN引数:変数,数値説明:変数([変数])に[数値]を代入・ VM 命令: DRAW_IMAGE引数:数値1説明: [数値1]番目のイメージを描く・ VM 命令: DRAW_IMAGE引数:数値1,数値2,数値3説明: [数値1]番目のイメージを([数値2],[数値3]を左上として描く・ VM 命令: DRAW_IMAGE引数:数値1,数値2,数値3,数値4,数値5説明:[数値1]番目のイメージを([数値2],[数値3])を左上として横([数値4])縦([数値5])のサイズで描く・ VM 命令: DRAW_IMAGE_I引数:数値1,数値2説明: [数値1]番目のイメージに[数値2]番目のイメージを描く・ VM 命令: DRAW_IMAGE_I引数:数値1,数値2,数値3,数値4説明:[数値1]番目のイメージに[数値2]番目のイメージを([数値3],[数値4])を左上として描く・ VM 命令: DRAW_IMAGE_I引数:数値1,数値2,数値3,数値4,数値5,数値6説明:[数値1]番目のイメージに[数値2]番目のイメージを([数値3],[数値4])を左上として横([数値5])縦([数値6])のサイズで描く・ VM 命令:D_TIME引数:時間1,時間2説明:[時間1]と[時間2]の時間差・ VM 命令:E説明:自然対数の底・ VM 命令: END説明:プログラムを終了・ VM 命令: EQUALS引数:数値1,数値2説明:[数値1]==[数値2]・ VM 命令: EXP引数:数値1説明: e(2.718...)[数値1]の乗・ VM 命令: FILL_CIRCLE引数:数値1,数値2,数値3説明:中心([数値1],[数値2]半径[数値3]の塗り潰し円を描く・ VM 命令: FILL_CIRCLE_IMAGE引数:数値1,数値2,数値3,数値4説明:中心([数値1],[数値2])半径[数値3]の塗り潰し円を[数値4]番目のイメージに描く・ VM 命令: FILL_RECT引数:数値1,数値2,数値3,数値4説明:([数値1],[数値2])から([数値3],[数値4])を対角線とした塗り潰し長方形を描く・ VM 命令: FILL_RECT_IMAGE引数:数値1,数値2,数値3,数値4,数値5説明:([数値1],[数値2])から([数値3],[数値4])を対角線とした塗り潰し長方形を[数値5]番目のイメージに描く・ VM 命令: FOR引数:変数1,数値1,数値2,ブロック,数値3説明:[変数1]が[数値1]から[数値2]になるまで[ブロック]の処理を繰り返す(刻み幅は[数値3])・ VM 命令: FORE_COLOR引数:数値1,数値2,数値3説明:グラッフィクスの色をRGB([数値1],[数値2],[数値3])に設定・ VM 命令: FORE_COLOR16引数:数値説明:グラッフィクスの色を、次の16 色から[数値]で選択し設定([0] 黒,[1] 青,[2] 赤,[3] マゼンダ,[4] 緑,[5] シアン,[6] 黄,[7] 白,[8] 銀,[9] 暗い青,[10] 暗い赤,[11] 暗いマゼンダ,[12] 暗い緑,[13] 暗いシアン,[14] 暗い黄,[15] 灰)・ VM 命令: FRAC引数:数値1説明: [数値1]の小数部分・ VM 命令:F_CLOSE引数:数値説明:[数値]番目のファイルを閉じる・ VM 命令:F_INPUT引数:数値,変数説明:[数値]番目のファイルから[変数]に値を入れる・ VM 命令:F_OPEN引数:数値1,文字列1,文字列2説明:[数値1]番目のファイルとして、ファイル([文字列1])を[文字列2]([r]読み込み用,[w]書きこみ用,[a]追加書き込み用)として開く・ VM 命令:F_PRINT引数:数値,データ説明:[数値]番目のファイルに[データ]を書き込む・ VM 命令: GOSUB引数:ラベル説明:ここから[ラベル]に飛んで、return文があれば戻って来る・ VM 命令:GOTO引数:ラベル説明:ここから[ラベル]に飛ぶ・ VM 命令: GREATER引数:数値1,数値2説明: [数値1]>[数値2]・ VM 命令: GREATER EQ引数:数値1,数値2説明:[数値1]>=[数値2]・ VM 命令: HEX引数:数値説明:[数値]を16進数にした文字列・ VM 命令:IF引数:ブール式,ブロック説明:[ブール式]が、本当なら[ブロック]の処理を実行・ VM 命令:IF_ELSE引数:ブール式,ブロック1,ブロック2説明:[ブール式]が、本当なら[ブロック1]の処理を、本当でないなら[ブロック2]の処理を実行・ VM 命令: INKEY説明:キーボードから入力された1文字・ VM 命令: INKEY2説明:今、押されているキーボードの文字・ VM 命令: INPUT引数:変数説明:[変数]に値を入力・ VM 命令: INSTR引数:文字列1,文字列2説明:[文字列1]の中で最初の[文字列2]の番号
・ VM 命令: INT引数:数値1説明:[数値1]の整数部分・ VM 命令: LEFT引数:文字列,数値説明:[文字列]の中で、左から[数値]文字を抜き出した文字列・ VM 命令: LEN引数:文字列説明:[文字列]の文字数・ VM 命令: LESS引数:数値1,数値2説明:[数値1]<[数値2]・ VM 命令: LESS_EQ引数:数値1,数値2説明:[数値1]<=[数値2]・ VM 命令: LINE引数:数値1,数値2,数値3,数値4説明:([数値1],[数値2])から([数値3],[数値4])まで線を引く・ VM 命令: LINE_IMAGE引数:数値1,数値2,数値3,数値4,数値5説明:([数値1],[数値2])から([数値3],[数値4])まで線を[数値5]番目のイメージに引く・ VM 命令: LOCATE引数:数値1,数値2説明:[数値1]行目の[数値2]文字目へカーソルを移動・ VM 命令: LOG引数:数値1説明:の自然対[数値1]数値(底はe)・ VM 命令: LOWER引数:文字列説明:[文字列]を小文字にした文字列・ VM 命令: MAX引数:数値1,数値2説明:[数値1]と[数値2]で小さい方の数・ VM 命令: MID引数:文字列,数値1,数値2説明:[文字列]の中で、[数値1]から[数値2]番目の文字を抜き出した文字列・ VM 命令: MIN引数:数値1,数値2説明:[数値1]と[数値2]で大きい方の数・ VM 命令: MOD引数:数値1,数値2説明:[数値1]を[数値2]で割った余り・ VM 命令: MOUSE_B説明:現在、マウスで押されているボタン(0-なし、1-ボタン1 、2-ボタン2 、3-同時押し)・ VM 命令: MOUSE_B2説明:押されたマウスのボタン(1-ボタン1 、2-ボタン2 、3-同時押し)・ VM 命令: MOUSE_X説明:現在のマウスのx座標・ VM 命令: MOUSE_Y説明:現在のマウスのy座標・ VM 命令: MULT引数:数値1,数値2説明:[数値1]×[数値2]・ VM 命令:NOT引数:ブール値説明:![ブール値]・ VM 命令:NOT_EQ引数:数値1,数値2説明:[数値1]!=[数値2]・ VM 命令: NPRINT引数:データ説明:[データ]を改行無しで標準出力・ VM 命令:OR引数:ブール値1,ブール値2説明:[ブール値1]||[ブール値2]・ VM 命令:PI説明:円周率・ VM 命令: PLUS引数:数値1,数値2説明:[数値1]+[数値2]・ VM 命令:POW引数:数値1,数値2説明:[数値1]の[数値2]乗・ VM 命令: PRINT引数:データ説明:[データ]を改行ありで標準出力・ VM 命令: READ引数:変数説明:順番にデータを読んで、[変数]に入れる・ VM 命令: RECT引数:数値1,数値2,数値3,数値4説明:([数値1],[数値2])から([数値3],[数値4])を対角線とした長方形を描く・ VM 命令: RECT_IMAGE引数:数値1,数値2,数値3,数値4,数値5説明:[数値1],[数値2]から([数値3],[数値4])を対角線とした長方形を[数値5]番目のイメージに描く・ VM 命令: RESTORE説明:データを最初から読み直す・ VM 命令: RESTORE_LABEL引数:ラベル説明:[ラベル]からデータを読み直す・ VM 命令: RETURN説明: gosub したところに戻る・ VM 命令: RIGHT引数:文字列,数値説明:[文字列]の中で、右から[数値]文字を抜き出した文字列・ VM 命令: RND説明:0から1までの乱数・ VM 命令: RND引数:数値1説明:0から[数値1]までの乱数・ VM 命令: SIG引数:数値1説明:[数値1]の符合・ VM 命令: SIN引数:数値1説明:角度([数値1])の正弦・ VM 命令: SQR引数:数値1説明:[数値1]の2乗・ VM 命令: SQRT引数:数値1説明:[数値1]の平方根・ VM 命令: STR引数:数値説明:[数値]を変換した文字列・ VM 命令: STRINGADD引数:文字列1,文字列2説明:[文字列1]+[文字列2]・ VM 命令: STRING_ASIGN引数:文字列変数,文字列説明:文字列変数([文字列変数])に[文字列]を代入・ VM 命令: STRING_EQUALS引数:文字列1,文字列2説明:[文字列1]==[文字列2]・ VM 命令: STRING_NOT_EQ引数:字列1,文字列2説明: [字列1]!==[文字列2]・ VM 命令: SUB引数:数値1,数値2説明:[数値1]-[数値2]・ VM 命令:TAN引数:数値1説明:角度([数値1])の正接・ VM 命令: TEXT引数:数値1,数値2,文字列説明:([数値1],[数値2])に[文字列]を書く・ VM 命令: TEXT_IMAGE引数:数値1,数値2,文字列,数値3説明:([数値1],[数値2])に[文字列]を[数値3]番目のイメージ書く・ VM 命令: TIME説明:現在の時間・ VM 命令: UPPER引数:文字列説明:[文字列]を大文字にした文字列・ VM 命令:VAL引数:文字列説明:[文字列]を数値にした数・ VM 命令: WAIT引数:数値説明:[数値]秒間処理を中断・ VM 命令:W_CLEAR説明:ウインドウに書いてある絵を消す・ VM 命令:W_CLOSE説明:ウインドウを閉じる・ VM 命令:W_OPEN引数:数値1,数値2,文字列説明:横([数値1])縦([数値2])のサイズでタイトル([文字列])をつけてウインドウを開く・ VM 命令:W_OPEN引数:数値1,数値2説明:横([数値1])縦([数値2])のサイズのウインドウを開く7.2 テーブル処理VM表7.2:テーブル処理VM 命令一覧・ VM 命令: ABS引数:数値1説明:[数値1]の絶対値・ VM 命令: ACOS引数:数値1説明:角度([数値1])の逆余弦・ VM 命令: AND引数:ブール値1,ブール値2説明:[ブール値1]&&[ブール値2]・ VM 命令: ASCENDING SORT説明:指定された領域内のデータを昇順に並び替える・ VM 命令: ASIN引数:数値1説明:角度([数値1])の逆正弦・ VM 命令:ATAN引数:数値1説明:角度([数値1])の逆正接・ VM 命令: AVERAGE引数:データ説明:[データ]の平均値を計算する・ VM 命令: CALL説明:シート上でのセルのレンダリング・ VM 命令:CF_IF引数:ブール式,ブロック1,ブロック2説明:[ブール式]が正しければ、[ブロック1]をそうでなければ[ブロック2]を実行する・ VM 命令: CLEAR_CUT_BUFFERS説明:カットバッファを初期化する・ VM 命令: COPY説明:指定されている領域をコピーする・ VM 命令: COS引数:数値1説明:角度([数値1])の余弦・ VM 命令: CREATE_SHEET引数:文字列説明:シート([文字列])を追加する・ VM 命令: DELETE説明:指定されている領域を削除する・ VM 命令: DELETE_COLUMN説明:指定されている列を削除する・ VM 命令: DELETE_CUT_BUFFER説明:指定されているカットバッファを削除する・ VM 命令: DELETE_ROW説明:指定されている行を削除する・ VM 命令: DELETE_SHEET説明:選択されているシートを削除する・ VM 命令: DESCENDING_SORT説明:指定された領域内のデータを降順に並べ替える・ VM 命令: DIVIDED_BY引数:数値1,数値2説明:[数値1]÷[数値2]・ VM 命令:E説明:自然対数の底・ VM 命令:EQ引数:数値1,数値2説明:[数値1]==[数値2]・ VM 命令:EQ_STRING引数:文字列1,文字列2説明:[文字列1]==[文字列2]・ VM 命令: EXP引数:数値1説明: e(2.718...)の[数値1]乗・ VM 命令: FALSE説明:偽・ VM 命令: FRAC引数:数値1説明:[数値1]の小数部分・ VM 命令:GT引数:数値1,数値2説明:[数値1]>[数値2]・ VM 命令:GT_EQ引数:数値1,数値2説明:[数値1]>=[数値2]・ VM 命令:IF_SEARCH引数:条件式説明:[条件式]に合う領域内のセルを検索する・ VM 命令: INPUT_CELL引数:セル番地説明:[セル番地]への入力・ VM 命令: INSERT_COLUMN説明:列を挿入する・ VM 命令: INSERT_ROW説明:行を挿入する・ VM 命令: INT引数:数値1説明:[数値1]の整数部分・ VM 命令:LE引数:数値1,数値2説明:[数値1]<[数値2]・ VM 命令:LE_EQ引数:数値1,数値2説明:[数値1]<=[数値2]・ VM 命令: LOG引数:数値1説明:[数値1]の自然対数値(底はe)・ VM 命令: MAX引数:データ説明:[データ]の最大値を計算する・ VM 命令: MIN引数:データ説明:[データ]の最小値を計算する・ VM 命令: MINUS引数:数値1,数値2説明:[数値1]-[数値2]・ VM 命令: MOD引数:数値1,数値2説明:[数値1]を[数値2]で割った余り・ VM 命令:MOVE引数:文字列,移動前,移動先説明:シート名([文字列])の[移動前]から[移動先]へデータを移動する・ VM 命令: NEW_BOOK説明:データをすべて初期化する・ VM 命令:NOT引数:ブール値説明:![ブール値]・ VM 命令:NOT_EQ引数:数値1,数値2説明:[数値1]!=[数値2]・ VM 命令:NOT_EQ_STRING引数:文字列1,文字列2説明:[文字列1]!=[文字列2]・ VM 命令: OPEN引数:文字列説明:ファイル([文字列])を開く・ VM 命令:OR引数:ブール値1,ブール値2説明:[ブール値1]-[ブール値2]・ VM 命令: PASTE説明:指定されている領域へ選択されているカットバッファのデータをペーストする・ VM 命令:PI説明:円周率・ VM 命令: PLUS引数:数値1,数値2説明:[数値1]+[数値2]・ VM 命令: PLUS_STRING引数:文字列1,文字列2説明:[文字列1]+[文字列2]・ VM 命令:POW引数:数値1,数値2説明:[数値1]の[数値2]乗・ VM 命令: PRODUCT引数:データ説明:[データ]の積を計算する・ VM 命令: READ_CELL説明:セルのデータを読み込む・ VM 命令: REDO説明:一つ先の状態に戻る・ VM 命令: REFER_CELL引数:数値1,数値2,数値3説明:シート([数値1])の[数値2]行[数値3]列をセルを参照する・ VM 命令: REFER_REGION引数:数値1,数値2,数値3,数値4,数値5説明:シート([数値1])の[数値2]行[数値3]列〜[数値4]行[数値5]列までのセル領域を参照する・ VM 命令: REPLACE引数:文字列1,文字列2説明:領域内の[文字列1]を[文字列2]へ置換する・ VM 命令: RND説明:0 から1 までの乱数・ VM 命令: RND引数:数値1説明:0 から[数値1]までの乱数・ VM 命令:SAVE説明:現在のファイル名でセーブする・ VM 命令:SAVE_AS引数:文字列説明:ファイル名を[文字列]でセーブする・ VM 命令: SEARCH引数:文字列説明:[文字列]が含まれる領域内のセルを検索する・ VM 命令: SET_CELL引数:数値1,数値2説明:[数値1]行[数値2]列のセルを編集可能な状態にする・ VM 命令: SET_CELL_AREA引数:数値1,数値2,数値3,数値4説明:[数値1]行[数値2]列〜[数値3]行[数値4]列までのセル領域を編集可能な状態にする・ VM 命令: SET_CUT_BUFFER引数:数値説明:カットバッファ([数値])を表示する・ VM 命令: SET_SHEET引数:文字列説明:シート([文字列])を編集可能な状態にする・ VM 命令: SET_SHEET_NAME引数:文字列1,文字列2説明:シート名を[文字列1]から[文字列2]へ変更する・ VM 命令: SHIFT_CUT_BUFFER引数:数値説明:カットバッファを[数値]の分だけ右に移動する・ VM 命令: SHOW_GRAPH説明:指定された領域内のデータをグラフィック出力する・ VM 命令: SIG引数:数値1説明:[数値1]の符合・ VM 命令: SIN引数:数値1説明:角度([数値1])の正弦・ VM 命令: SQR引数:数値1説明:[数値1]の2乗・ VM 命令: SQRT引数:数値1説明:[数値1]の平方根・ VM 命令: SUM引数:データ説明:[データ]の合計を計算する・ VM 命令:TAN引数:数値1説明:角度([数値1])の正接・ VM 命令: TIMES引数:数値1,数値2説明:[数値1]×[数値2]・ VM 命令:TRUE説明:真・ VM 命令: UNDO説明:一つ前の状態に戻る7.3 テキストVM・ VM 命令: COLOR引数:赤,緑,青説明:選択領域を([赤],[緑],[青])色にする・ VM 命令: COPY説明:カレントコピーバッファに選択領域をコピー・ VM 命令: CREATE_BUFFER説明:カレントバッファを初期化・ VM 命令: DELETE説明:選択範囲を消す・ VM 命令: DELETE_BUFFER説明:カレントバッファを消す・ VM 命令: INPUT引数:文字列説明:[文字列]を入力・ VM 命令: INSERT説明:インサートモードに変更・ VM 命令: OVER説明:オーバーライドモードに変更・ VM 命令: PASTE説明:カレントコピーバッファからペースト・ VM 命令: REPLACE引数:文字列1,文字列2説明:[文字列1]を[文字列2]に置換・ VM 命令:SAVE引数:ファイルパス説明:カレントバッファを[ファイルパス]に保存・ VM 命令: SEARCH引数:文字列説明:[文字列]を検索・ VM 命令: SET_BUFFER引数:数字説明:[数字]番バッファをカレントにする・ VM 命令: SET_CARET引数:数字説明:[数字]番目の文字にカレットを移動・ VM 命令: SET_COPY引数:数字説明:[数字]番コピーバッファをカレントにする・ VM 命令: SET_SELECTION引数:数字説明:カレットの位置から[数字]文字を選択・ VM 命令: SIZE引数:数字説明:選択領域の文字サイズを[数字]にする【0026】第8章 付録8.1 エラーセージ一覧とその対処方法以下に、システムがエラーダイアログによって表示するエラーメッセージと、対処方法をまとめる。
・ 指定されたディレクトリはすでに存在します新規作成するプロジェクト名を、存在しないものに変更する。
・ プロジェクト用のディレクトリを作れませんプロジェクト用のディレクトリを書き込み許可にする。
・ VM 仕様ファイルが見つかりませんプロジェクト用のディレクトリにVM 仕様ファイルがあるか確認する。なければ、VM_SPEC からコピーする。
・ 作業用のディレクトリが用意できませんプロジェクト用のディレクトリを書き込み許可にする。
・ ファイルのセーブに失敗しましたプロジェクト用のディレクトリを書き込み許可にする。
・ プロジェクト名が決定されていません新規作成を行う。
・ ビルド用コマンドに必要なプロパティが設定されていませんプロパティで、コマンドパスを入力する。
・ java コマンドが見つかりませんプロパティで設定したjava コマンドのパスが正しいか確認する。
・ javac コマンドが見つかりませんプロパティで設定したjava コマンドのパスが正しいか確認する。
・ native2ascii コマンドが見つかりませんプロパティで設定したjava コマンドのパスが正しいか確認する。
・ 字句解析モジュールのコードが生成できません字句解析仕様の入力に間違いがある。間違いを訂正して、再度ビルドを実行する。
・ 構文解析モジュールのコードが生成できません構文解析仕様の入力に間違いがある。間違いを訂正して、再度ビルドを実行する。
・ Parser のコンパイルに失敗しました構文解析仕様のアクションコードに間違いがある。間違いを訂正して、再度ビルドを実行する。
・ Scanner のコンパイルに失敗しました字句仕様のアクションコードに間違いがある。間違いを訂正して、再度ビルドを実行する。
・ 文法要素が決定されていません文法要素を決定してから、マッピングを行う。
・ まだ、コードが生成されていませんマッピングを行ってから、コード編集を行う。
・ 削除する命令が指定されていません削除するサブ命令を指定してから、命令削除を実行する。
・ ルートの命令は削除できませんルート以外の命令を指定する。
・ サブ命令を持つ命令を削除することはできませんまずすべてのサブ命令を削除する。
・ VM インストラクションへの対応付けが完了していませんマッピングを全ての命令に行う。
・ パターンが設定されていませんパターンを決定してから、コード編集を行う。
【0027】前記した実施形態の実行は、当業者にはコンピュータにより容易に実行可能である。そのためのプログラムは、コンピュータで読み取り可能な記録媒体、例えばHD、FD、CD、MOなど、任意のものに格納できる。また、このプログラムを伝送するための信号とは、例えば、ネットワークを用いて本発明を実施する場合に必要となる、電圧、電流、電磁波、光、その他の伝送媒体における信号であり、要するに、情報としてのプログラムを伝送させるための信号である。
【0028】なお、前記実施形態の記載は単なる一例に過ぎず、本発明に必須の構成を示したものではない。各部の構成は、本発明の趣旨を達成できるものであれば、上記に限らない。また、本実施形態を実現するための具体的手段は、ハードウエア、ソフトウエア、ネットワーク、これらの組み合わせ、その他の任意の手段を用いることができ、このこと自体は当業者において自明である。また、機能ブロックどうしが複合して一つの機能ブロックに集約されても良い。さらには、当然のことながら、一つの機能ブロックを実現する手段が分散して配置されていても良い。
【0029】
【発明の効果】本発明によれば、プログラミング言語の作成を支援するためのシステムを提供することができる。これにより、例えば、コンパイラの非専門家であっても、教育目的に適した独自のプログラミング言語を作成することが容易となる。
【出願人】 【識別番号】500458859
【氏名又は名称】有限会社トライネット
【識別番号】500015272
【氏名又は名称】情報処理振興事業協会
【出願日】 平成12年10月2日(2000.10.2)
【代理人】 【識別番号】100091904
【弁理士】
【氏名又は名称】成瀬 重雄
【公開番号】 特開2002−108626(P2002−108626A)
【公開日】 平成14年4月12日(2002.4.12)
【出願番号】 特願2000−301847(P2000−301847)