(57)【特許請求の範囲】
【請求項１】
ニモニック形式または関数形式または算術形式の少なくともいずれかひとつを含む記述形式にもとづいたプロセッサ命令シンタックスを構成するトークンやオペランド変数の構成パターンを表すトークン情報テーブルと、
オペランド変数の意味や候補となるトークンを表すオペランド情報テーブルと、
入力ファイルの入力文字列を複数のトークンに分解処理し、前記オペランド情報テーブルを参照しながら、得られた前記トークンの構成パターンに合致するトークンの構成パターンをもつ命令を前記トークン情報テーブルから探索処理する構文解析ユニットと、
を備え、
前記構文解析ユニットは、１行分の入力文字列毎に、１字ずつ取得した文字とその前の文字の判定結果に基づき当該１字の文字種別を判定し、当該１文字におけるトークン境界判定状態と当該１文字の文字種別とにもとづいて、当該１文字が新たなトークンの一部であるか否かを判定することによって、入力ファイルの入力文字列を複数のトークンに分解する、
ことを特徴とするソースファイルからオブジェクトコードを出力するアセンブル装置。
【請求項２】
請求項１に記載のアセンブル装置であって、
前記構文解析ユニットは、
入力ファイルの入力文字列を複数のトークンに分解する際に、
もし判定した前記文字種別が記号文字であれば、当該１字を基準にトークンの境界を識別してトークンを抽出し、
もし判定した前記文字種別がシンボル先頭文字であれば、シンボル文字と異なる文字の検出時に、当該１字を基準にトークンの境界を識別してトークンを抽出し、
もし判定した前記文字種別が数字であれば、数字と異なる文字の検出時に、当該１字を基準にトークンの境界を識別してトークンを抽出する、
ことによって、トークン境界判定状態と当該１文字の文字種別にもとづいて入力ファイルの入力文字列を複数のトークンに分解する
ことを特徴とするアセンブル装置。
【請求項３】
請求項１又は２に記載のアセンブル装置であって、
前記構文解析ユニットは、前記入力文字列のトークンの構成パターンに合致するトークンの構成パターンをもつ命令を前記トークン情報テーブルから探索する際に、
前記入力文字列から第１のトークンを取り出し、
前記トークン情報テーブルのひとつの既知命令を構成する複数のトークンの中から前記第１のトークンに対応する位置にある第２のトークンを取り出し、
取り出した第２のトークンがオペランドを表す変数であるか否かを識別して、その結果に基づき、意味一致検査もしくは文字列一致検査を行い、
前記入力文字列の全てのトークンについて意味一致検査もしくは文字列一致検査に適合するような既知命令を前記トークン情報テーブルから探し出す、
ことを特徴とするアセンブル装置。
【請求項４】
請求項３記載のアセンブル装置であって、
前記構文解析ユニットは、第２のトークンがオペランド変数ではない場合に、
第１および第２のトークンが文字列として一致するか否かを検査する文字一致検査を行う、
ことを特徴とするアセンブル装置。
【請求項５】
請求項３又は４に記載のアセンブル装置であって、
前記構文解析ユニットは、第２のトークンがオペランド変数の場合に、
前記オペランド情報テーブルを参照しながら、前記オペランド変数が表すトークン候補の中に第１のトークンが含まれているときに一致と判定する意味一致検査を行う、
ことを特徴とするアセンブル装置。
【請求項６】
ニモニック形式または関数形式または算術形式の少なくともいずれかひとつを含む記述形式にもとづいたプロセッサ命令シンタックスを構成するトークンやオペランド変数の構成パターンを表すトークン情報テーブルと、オペランド変数の意味や候補となるトークンを表すオペランド情報テーブルと、を記憶保持し、
入力ファイルの入力文字列を複数のトークンに分解し、前記オペランド情報テーブルを参照しながら、得られた前記トークンの構成パターンに合致するトークンの構成パターンをもつ命令を前記トークン情報テーブルから探索するように構文解析処理を行う際に、
１行分の入力文字列毎に、１字ずつ取得した文字とその前の文字の判定結果に基づき当該１字の文字種別を判定し、当該１文字におけるトークン境界判定状態と当該１文字の文字種別とにもとづいて、当該１文字が新たなトークンの一部であるか否かを判定することによって、入力ファイルの入力文字列を複数のトークンに分解する処理を含む、
ことを特徴とするアセンブラの命令の構文解析方法。
【請求項７】
請求項６に記載のアセンブラの構文解析方法であって、
入力ファイルの入力文字列を複数のトークンに分解する際に、
もし判定した前記文字種別が記号文字であれば、当該１字を基準にトークンの境界を識別してトークンを抽出し、
もし判定した前記文字種別がシンボル先頭文字であれば、シンボル文字と異なる文字の検出時に、当該１字を基準にトークンの境界を識別してトークンを抽出し、
もし判定した前記文字種別が数字であれば、数字と異なる文字の検出時に、当該１字を基準にトークンの境界を識別してトークンを抽出する、
ことによって、トークン境界判定状態と当該１文字の文字種別にもとづいて  入力ファイルの入力文字列を複数のトークンに分解する
ことを特徴とする構文解析方法。
【請求項８】
請求項６又は７に記載の構文解析方法であって、
前記構文解析は、前記入力文字列のトークンの構成パターンに合致するトークンの構成パターンをもつ命令を前記トークン情報テーブルから探索する際に、
前記入力文字列から第１のトークンを取り出し、
前記トークン情報テーブルのひとつの既知命令を構成する複数のトークンの中から前記第１のトークンに対応する位置にある第２のトークンを取り出し、
取り出した第２のトークンがオペランドを表す変数であるか否かを識別して、その結果に基づき、意味一致検査もしくは文字列一致検査を行い、
前記入力文字列の全てのトークンについて意味一致検査もしくは文字列一致検査に適合するような既知命令を前記トークン情報テーブルから探し出す、
ことを特徴とする構文解析方法。
【請求項９】
請求項８記載の構文解析方法であって、
第２のトークンがオペランド変数でない場合に、
第１および第２のトークンが文字列として一致するか否かを検査する文字一致検査を行う、
ことを特徴とする構文解析方法。
【請求項１０】
請求項８又は９に記載の構文解析方法であって、
第２のトークンがオペランド変数の場合に、
前記オペランド情報テーブルを参照しながら、前記オペランド変数のトークン候補の中に第１のトークンが含まれるときに一致と判定する意味一致検査を行う、
ことを特徴とする構文解析方法。
【請求項１１】
コンピュータのＣＰＵを、
入力ファイルの入力文字列を複数のトークンに分解処理すると共に、オペランド変数の意味や候補となるトークンを表すオペランド情報テーブルを参照しながら、得られた前記トークンの構成パターンに合致するトークンの構成パターンをもつ命令を、ニモニック形式または関数形式または算術形式の少なくともいずれかひとつを含む記述形式にもとづいたプロセッサ命令シンタックスを構成するトークンやオペランド変数の構成パターンを表すトークン情報テーブルから探索処理する構文解析ユニット、
として動作させ、
前記構文解析ユニットを、１行分の入力文字列毎に、１字ずつ取得した文字とその前の文字の判定結果に基づき当該１字の文字種別を判定し、当該１文字におけるトークン境界判定状態と当該１文字の文字種別とにもとづいて、当該１文字が新たなトークンの一部であるか否かを判定することによって、入力ファイルの入力文字列を複数のトークンに分解するように動作させる
ことを特徴とするアセンブラプログラム。
【請求項１２】
請求項１１に記載のアセンブラプログラムであって、
入力ファイルの入力文字列を複数のトークンに分解する処理において、
前記構文解析ユニットを、
もし判定した前記文字種別が記号文字であれば、当該１字を基準にトークンの境界を識別してトークンを抽出し、
もし判定した前記文字種別がシンボル先頭文字であれば、シンボル文字と異なる文字の検出時に、当該１字を基準にトークンの境界を識別してトークンを抽出し、
もし判定した前記文字種別が数字であれば、数字と異なる文字の検出時に、当該１字を基準にトークンの境界を識別してトークンを抽出する、
ように動作させる、
ことを特徴とするアセンブラプログラム。
【請求項１３】
請求項１１又は１２に記載のアセンブラプログラムであって、
前記構文解析ユニットが、前記入力文字列のトークンの構成パターンに合致するトークンの構成パターンをもつ命令を前記トークン情報テーブルから探索する際に、
前記入力文字列から第１のトークンを取り出し、
前記トークン情報テーブルのひとつの既知命令を構成する複数のトークンの中から前記第１のトークンに対応する位置にある第２のトークンを取り出し、
取り出した第２のトークンがオペランドを表す変数であるか否かを識別して、その結果に基づき、意味一致検査もしくは文字列一致検査を行い、
前記入力文字列の全てのトークンについて意味一致検査もしくは文字列一致検査に適合するような既知命令を前記トークン情報テーブルから探し出す、
ように動作させることを特徴とするアセンブラプログラム。
【請求項１４】
請求項１３記載のアセンブラプログラムであって、
第２のトークンがオペランド変数でない場合に、
第１および第２のトークンが文字列として一致するか否かを検査する文字一致検査を行わせる、
ことを特徴とするアセンブラプログラム。
【請求項１５】
請求項１３又は１４に記載のアセンブラプログラムであって、
第２のトークンがオペランド変数の場合に、
前記オペランド情報テーブルを参照しながら、前記オペランド変数のトークン候補の中に第１のトークンが含まれるときに一致と判定する意味一致検査を行わせる、
ことを特徴とするアセンブラプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサへのプログラムを機械語に翻訳するためのアセンブラに関し、特に、様々な命令記述スタイルに対応可能な汎用アセンブラおよび、その字句解析方法、構文解析方法に関する。
【背景技術】
【０００２】
アセンブラとは、ＣＰＵ（ＣＥＮＴＲＡＬ  ＰＲＯＣＥＳＳＩＮＧ  ＵＮＩＴ）やＤＳＰ（ＤＩＧＩＴＡＬ  ＳＩＧＮＡＬ  ＰＲＯＣＥＳＳＯＲ）などのプロセッサ用プログラムを機械語へ翻訳するためのソフトウェアである。当該プログラムはアセンブリ言語と呼ばれる言語で記述される。アセンブリ言語は、プロセッサの命令を直接記述可能な言語である。プロセッサの命令の記述スタイルは、ＣＰＵやＤＳＰ毎に様々であるが、一般的には、以下の三つの形式に分類できる。
・ニモニック形式：“ｍｎｅｍｏｎｉｃ  ｏｐｅｒａｎｄ０，ｏｐｅｒａｎｄ１，…”
・関数形式：“ｄｓｔ＝ｍｎｅｍｏｎｉｃ（ｓｒｃ０、ｓｒｃ１，…）”
・算術形式：“ｄｓｔ＝ｓｒｃ０＋ｓｒｃ１”
ニモニック形式は、ニモニック（ｍｎｅｍｏｎｉｃ）と呼ばれる命令の名前を表す文字列と、複数のオペランドを使って、命令を表記する記述スタイルである。
関数形式は、Ｃ言語の関数呼び出しのような形式で命令を表記する記述スタイルである。
算術形式は、Ｃ言語の演算（四則演算や論理演算など）のような形式で命令を表記する記述スタイルである。
関数形式と算術形式では、演算結果を格納するオペランドが明記されており、ニモニック形式に比べて、命令の動作を理解し易い。
プロセッサ毎のアセンブラの開発方法は、一般に、命令の記述スタイル（文法）を決めてから、その記述スタイルに合わせたアセンブラを開発する。換言すれば、プロセッサの記述スタイルを変更したり修正したりすると、アセンブラを再度開発する必要が生ずる。
命令の文法が定まれば、プログラマは、例えば、手作業やｙａｃｃ／ｌｅｘというツールを使って、その文法に合わせた構文解析器を作成できる。
アセンブラに関する関連技術は、特開平８−２８６９２７号公報（特許文献１）及び特開平６−２５９２６１号公報（特許文献２）に記載されている。
特許文献１で説明されているアセンブラは、データベースに格納された命令のシンタックスやフィールドに関する情報をもちいて、プロセッサが命令をアセンブルする。この方式は、命令に関する情報をデータベースに格納しているため、データベースの命令情報を変更するだけで、さまざまな命令に対応可能である。
特許文献２で説明されているアセンブラのニモニック構文解析処理方法は、算術形式で記述された命令を含むソースプログラムを読み込み、命令文字列をトークンに分解及び解析してコードを生成する。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
特許文献１のアセンブラは、ニモニック形式の記述スタイルだけに対応しており、その他の記述スタイルには対応していない。
特許文献２のニモニック構文解析処理方法は、算術形式の記述スタイルだけに対応しており、その他の記述スタイルには対応していない。
即ち、特許文献１及び特許文献２のアセンブラは、命令の記述スタイルに関して汎用性がない。そのため、これらの方式では、記述スタイルごとに、構文解析器を作り直す必要がある。
ひとつの構文解析器で様々な命令の記述スタイルに対応することが、アセンブラにおける課題のひとつになっている。そのような構文解析器があれば、命令の記述スタイルに関係なく、ひとつの構文解析器を共通して使用することができる。
本発明は、ニモニック形式と関数形式と算術形式の命令記述形式に対応できる構文解析器を有するアセンブル装置、構文解析方法を提供する。
【課題を解決するための手段】
【０００４】
本発明に係るアセンブル装置は、ニモニック形式または関数形式または算術形式の少なくともいずれかひとつを含む記述形式にもとづいたプロセッサ命令シンタックスを構成する単語（トークン）やオペランド変数の構成パターンを表すトークン情報テーブルと、オペランド変数の意味や候補となるトークンを表すオペランド情報テーブルと、アセンブル装置への入力ファイルから取り出された入力文字列を複数のトークンに分解処理し、オペランド情報テーブルを参照しながら、得られた前記トークンの構成パターンに合致するトークンの構成パターンをもつ命令をトークン情報テーブルから探索処理する構文解析ユニットと、を有し、前記構文解析ユニットは、１行分の入力文字列毎に、１字ずつ取得した文字とその前の文字の判定結果に基づき当該１字の文字種別を判定し、当該１文字におけるトークン境界判定状態と当該１文字の文字種別とにもとづいて、当該１文字が新たなトークンの一部であるか否かを判定することによって、入力ファイルの入力文字列を複数のトークンに分解する、ことを特徴とする。
【発明の効果】
【０００５】
本発明によれば、ニモニック形式と関数形式と算術形式の命令記述形式に対応できる構文解析器を実現するアセンブル装置、構文解析方法、記憶媒体およびアセンブラプログラムを提供できる。
【図面の簡単な説明】
【０００６】
図１は、本発明の模範的な実施形態におけるアセンブラ１００および構文解析ユニット１１０の構成を示す機能ブロック図である。
図２は、アセンブラ１００の処理を示すフローチャートである。
図３は、ステップＳ３「トークン分解」の処理を示すフローチャートである。
図４は、ステップＳ３２における、入力文字列から１文字を取得する処理を表す説明図である。
図５は、ステップＳ３３「文字種別判定」における、入力文字列から取り出した文字と文字種別の関係を示す説明図である。
図６は、ステップＳ３４「トークン境界判定」における、トークン境界判定の状態遷移を表す説明図である。
図７は、図６の「先頭位置移動」の処理内容を示す説明図である。
図８Ａ及び図８Ｂは、図６の「トークン抽出」の処理内容を示す説明図である。
図９は、図６の「文字差し戻し」の処理内容を示す説明図である。
図１０は、ステップＳ４「トークン情報マッチング」の処理を示すフローチャートである。
図１１は、ステップＳ４５「文字列一致検査」の処理内容を示す説明図である。
図１２は、ステップＳ４６「意味一致検査」の処理内容を示す説明図である。
図１３は、図１のソースファイル２００の例を表す説明図である。
図１４Ａ及び図１４Ｂは、命令のシンタックスの例を表す説明図である。
図１５Ａ及び図１５Ｂは、トークン情報テーブル１３０の例を表す説明図である。
図１６は、オペランド情報テーブル１４０の例を表す説明図である。
図１７は、オペコードテーブル１５０の例を表す説明図である。
図１８は、アセンブル装置の構成例を示すブロック図である。
【発明を実施するための形態】
【０００７】
本発明の実施の形態について図面を参照して説明する。
図１を参照すると、本発明の模範的な実施形態であるアセンブラ１００は、行分解ユニット１１１と、構文解析ユニット１１０と、命令エンコーダ１２０と、トークン情報テーブル１３０と、オペランド情報テーブル１４０と、オペコードテーブル１５０とを備える。
アセンブラ１００は、パーソナルコンピュータ（ＰＣ：ＰＥＲＳＯＮＡＬ  ＣＯＭＰＵＴＥＲ）（図示せず）の上で動作するプログラムとして構成され、そして、アセンブラ１００の各構成要素はそのプログラムの一部であってもよい。その場合には、ＰＣの記憶ユニット（図示せず）に、アセンブラ１００、ソースファイル２００が格納されており、ユーザの所定の指示をきっかけとして、ＰＣのＣＰＵは、アセンブラ１００とソースファイル２００とを記憶ユニットから読み出して、アセンブラ１００を実行し、ソースファイル２００からオブジェクトファイル３００を生成し、オブジェクトファイル３００を記憶ユニットへ格納する。
換言すれば、本発明に係るアセンブラ１００は、情報処理装置の記憶部に展開され、操作者の入力部に対するアセンブル実行操作に基づき、ＣＰＵを本発明に係る各ユニットとして動作させ、ソースファイル２００に対して字句解析および構文解析を実施し、アセンブルしてオブジェクトファイル３００を出力可能とする。変換されたオブジェクトファイル３００は、コードとしてマイコンに記録されたり、必要に応じて、画面上に表示されたり、プリンタを用いて用紙に印刷されたり、外部記憶装置に格納される。
次に、アセンブラ１００の各構成要素について説明する。
行分解ユニット１１１は、ソースファイル２００から一行分の文字列１１２を取り出し、それを構文解析ユニット１１０へ与える。
構文解析ユニット１１０は、一行分の文字列１１２に含まれる命令の命令ＩＤとオペランド値を調査し、それらを命令エンコーダ１２０へ与える。構文解析ユニット１１０は、トークン分解ユニット１１３とマッチングユニット１１５を備えている。トークン分解ユニット１１３は、一行分の文字列１１２を複数のトークンに分解し、複数のトークンの情報（トークン情報１１４）をマッチングユニット１１５へ与える。マッチングユニット１１５は、トークン情報テーブル１３０の中から、トークン情報１１４に一致するものを探索し、そのトークン情報の命令ＩＤを取得すると共に、オペランド情報テーブル１４０の中から、トークン情報１１４に含まれるオペランドの値（オペランド値）を取得する。
命令エンコーダ１２０は、命令ＩＤとオペランド値から、オペコードテーブル１５０を参照して命令コードを算出し、その命令コードをオブジェクトファイル３００に追加する。
アセンブラ１００は、ソースファイル２００から一行分の文字列１１２を取り出して、一行分の文字列１１２に含まれる命令の命令コードをオブジェクトファイル３００へ追加するという処理を、ソースファイル２００に含まれる全ての命令を処理するまで繰り返す。
次に、パーソナルコンピュータ上で動作するアセンブラ１００に基づく処理動作を説明する。なお、本発明と関係の薄い内容については、記載を簡略化又は省略する。なお、以下の説明では、アセンブラ１００に基づくＣＰＵの動作をアセンブラ１００が行なうこととして記載する。
＜アセンブラ１００の処理の流れ＞
図２を参照しながら、第一の実施形態におけるアセンブラ１００の処理の流れを説明する。アセンブラ１００は、ステップＳ１からＳ５までの五つのステップを繰り返す。
ステップＳ１において、アセンブラ１００は、入力ファイルであるソースファイル２００（図１参照）に、未処理の文字列（行）が残っているか否かを検査する。アセンブラ１００は、もしソースファイル２００に未処理の文字列が残っているならばステップＳ２へ、そうでなければ処理を終了する。
ステップＳ２において、アセンブラ１００は、ソースファイル２００の未処理の文字列の先頭位置から、命令を含む一行分の文字列を取得する。もし、未処理の文字列の先頭位置にある一行分の文字列がコメントや空白行であるならば、アセンブラ１００は、命令を含む一行分の文字列を取得できるまで、コメントや空白行を読み飛ばす。図１３は、ソースファイル２００の例である。図１３において、＃から始まる行はコメントであり、コメント行と空白行以外の行は命令を含む行であり、命令を含む行がステップＳ２で取得される文字列である。
ステップＳ３において、アセンブラ１００は、一行分の文字列を複数のトークンに分解する。この複数のトークンを未知命令のトークンと呼ぶことにする。トークンとは命令文字列を構成する単語である。トークンについては後で詳しく説明する。
ステップＳ４において、アセンブラ１００は、未知命令のトークンを、既知の命令に関する各種テーブルを参照して、既知の命令のトークンと比較し、未知命令の命令ＩＤとオペランドの値とを求める。この比較の手順については後で詳しく説明する。
ステップＳ５において、アセンブラ１００は、未知命令の命令ＩＤとオペランド値から未知命令の命令コードを計算し、その命令コードをオブジェクトファイル３００（図１参照）に追加する。
命令コードは、命令ＩＤによって一意に定義されるオペコードと、オペランドの文字列によって変わるオペランド値とを含む。
アセンブラ１００において、命令のエンコードを担当する命令エンコーダ１２０は、オペコードテーブル１５０から未知命令の命令ＩＤに対応するオペコードを取得する。このオペコードとステップＳ４で得られたオペランドの値に基づいて、命令エンコーダ１２０は、未知命令の命令コードを計算する。
ステップＳ５の後に、アセンブラ１００は、ステップＳ１へ移動し、ソースファイル２００の次の未処理の行にある未知命令を処理する。
図１７は、オペコードテーブル１５０の例である。図１７に示すオペコードテーブル１５０には、各命令について、命令ＩＤ、命令語長（ｂｉｔ数）、オペコード、オペランドの個数、各オペランドのビット長とビット位置が記録されている。図１７を参照すると、例えば、ＡＤＤという命令ＩＤの命令は、命令語長が３２ビットで、オペコードが“０ｘ１０１０００００”で、オペランドを３個有し、各オペランドが４ビットの長さで、三つのオペランドがビット０から１１までの１２ビットに配置される、ということがわかる。命令エンコーダ１２０は、図１７に例示したような既知であるオペコードの一覧の情報を使用して、命令をエンコードする。
以降では、命令のシンタックスとトークンについて説明してから、アセンブラ１００の重要な処理であるステップＳ３とステップＳ４について詳しく説明する。
＜命令のシンタックスとトークン＞
つづいて、命令のシンタックスとトークンについて説明する。
図１４Ａ及び図１４Ｂは、命令のシンタックスの例である。図１４Ａには、各命令の命令ＩＤとシンタックスと説明が示されている。命令ＩＤは各命令の名前のようなものであり、命令ＩＤを使って各命令は区別される。
命令のシンタックスは、命令の記述形式を表す文字列である。命令のシンタックスは、オペランド変数や記号などの文字列で構成される。オペランド変数は、命令のオペランド（レジスタや数値など）を表す変数であり、命令のシンタックスの中でオペランドを記述すべき位置とオペランドの意味とを表す。図１４Ｂには、図１４Ａで使われているオペランド変数の説明が示されている。
図１４Ａ及び図１４Ｂにあるような命令を字句解析して構文解析するために、アセンブラ１００は、トークン情報テーブル１３０とオペランド情報テーブル１４０を使用する。トークン情報テーブル１３０は、命令のシンタックスに含まれるトークンに関する情報を格納したテーブルである。トークンとは、命令のシンタックスの構成要素となる単語である。命令のシンタックスは、複数のトークンで構成されている。
命令のシンタックスのトークンは、図１５Ｂに示すように、オペランド変数、シンボル、数値、記号、の四種類がある。オペランド変数は、オペランドを表すトークンである。オペランド変数は“％”から始まる名前（文字列）をもつ。シンボルは、アルファベットや数字やアンダースコアで構成される１文字以上のトークンである。数値は、数値を示すトークンである。記号は、非アルファベットかつ非数字の１文字で構成されるトークンである。
図１５Ａは、トークン情報テーブル１３０の例である。図１５Ａに示されている例は、図１４Ａ及び図１４Ｂに示した各命令のシンタックスを構成するトークンの情報である。図１５Ａには、各命令について、命令ＩＤ、トークンの個数、各トークンのタイプと文字列が示されている。図１５Ａを参照すると、例えば、ＡＤＤという命令ＩＤの命令のシンタックスは、５個のトークンをもち、最初のトークンは“％ｏｐ０”というオペランド変数のトークンであり、その次のトークンは“＝”という記号のトークンであり、といったことがわかる。
オペランド変数で表現可能なトークンに関する情報は、オペランド情報テーブル１４０に格納されている。図１６はオペランド情報テーブル１４０の例である。オペランド情報テーブル１４０には、各オペランド変数について、命令ＩＤ、オペランド変数の名前、オペランド変数のタイプ、トークンの候補、オペランドの値が記されている。
オペランド変数のタイプは、オペランドの種類を表す。オペランド変数のタイプは、そのオペランド変数に当てはまるオペランドがレジスタなのか即値なのかといったことを表す。トークンの候補は、オペランド変数に当てはまるトークンの候補を表す。例えば、もしオペランド変数の種類がレジスタであるならば、オペランド変数に当てはまるレジスタの名前を表すシンボルトークンが、トークンの候補である。
図１６によると、例えば、ＡＤＤという命令ＩＤのオペランド変数“％ｏｐ０”は、Ｒレジスタを示すオペランド変数であって、そのトークン候補は“Ｒ０”から“Ｒ１５”までのＲレジスタの名前を表すシンボルトークンである、ということがわかる。
＜ステップＳ３：トークン分解＞
つづいて、図３を参照しながら、ステップＳ３（図２参照）の「トークン分解」処理について詳しく説明する。ステップＳ３は、ステップＳ３１からＳ３４の四つのステップを含む。
ステップＳ３１において、トークン分解ユニット１１３（図１参照）は、一行分の文字列（入力文字列）の中に未処理の文字が残っているかを検査し、もし残っているならばステップＳ３２へ移動し、残っていなければステップＳ３を終了する。
ステップＳ３２において、トークン分解ユニット１１３は、入力文字列から１文字を取得する。
文字を取得する処理を図４に例示する。図４には、１字目の文字を取得する前と後の入力文字列と補助情報が示されている。補助情報とは、文字列取得位置とトークン先頭位置である。文字列取得位置は、トークン分解ユニット１１３が文字を取得する位置を表す。トークン先頭位置は、現在のトークンの先頭の位置を表す。ステップＳ３２において、トークン分解ユニット１１３は、文字列取得位置から文字をひとつ取得し、その後に、文字取得位置を行末方向へ１字分移動する。図４の例では、文字を取得する以前の文字取得位置は入力文字列の行頭（“Ｒ”の位置）で、文字を取得した後の文字取得位置は入力文字列の行頭の右ひとつ隣（“５”の位置）である。
つづいて、ステップＳ３３の「文字種別判定」について詳しく説明する。ステップＳ３３において、トークン分解ユニット１１３は、取得した文字の文字種別を判定する。文字の種別を図５に示す。
トークン分解ユニット１１３は、文字の種別を、次のステップＳ３４のトークン境界判定の状態に基づいて決定する。トークン境界判定の状態については後で詳しく説明する。図５には、取得した文字がトークン境界判定の状態に基づいて、どの文字種別に分類されるかが示されている。文字の種別は、以下の五種類である。
・シンボル先頭文字：シンボル（アルファベット、数字、アンダースコアで構成される文字列）の先頭を表す文字
・シンボル文字：シンボルの先頭以外を表す文字
・数字：数値を表す文字
・空白文字：空白やタブを表す文字
・記号文字：アルファベット、数字、アンダースコア、空白、など以外の文字
例えば、取得した文字が０から９までのいずれかであって、トークン境界判定の状態が「シンボル状態」であれば、トークン分解ユニット１１３は、取得した文字の種別を「シンボル文字」と識別する。
つづいて、ステップＳ３４の「トークン境界判定」について詳しく説明する。ステップＳ３４において、トークン分解ユニット１１３は、現在のトークン境界判定の状態と、取得した文字の種別とに基づいて、取得した文字列が新たなトークンの一部であるか否かを判定する。トークン分解ユニット１１３は、トークン境界判定の状態と呼ばれる以下の三つの状態をもつ。
・ヌル状態：初期状態。トークン先頭位置から始まる文字列のトークンが不明であることを示す状態
・数値状態：トークン先頭位置から始まる文字列が数値トークンであることを示す状態
・シンボル状態：トークン先頭位置から始まる文字列がシンボルトークンであることを示す状態
ステップＳ３の「トークン分解」を開始する時点では、トークン境界判定の状態は「ヌル状態」である。そして、ステップＳ３４において、トークン分解ユニット１１３は、取得した文字が新たなトークンの一部であるか否かを判定した後で、トークン境界判定の状態を変更する。
トークン境界判定の状態の遷移を図６に示す。図６において、丸で示されているのが状態を、そこから伸びている矢印が取得した文字の種別による状態遷移を、四角で示されているのがトークン分解ユニット１１３で実行される処理を、それぞれ表す。例えば、ヌル状態において取得した文字がシンボル先頭文字である場合には、図６のヌル状態の上から伸びる矢印にしたがって、トークン分解ユニット１１３は状態をシンボル状態に遷移させる。このとき、もし矢印が四角の箱につながるならば、矢印の開始元の状態において、トークン分解ユニット１１３はその四角の処理を実行する。例えば、ヌル状態において取得した文字が空白文字である場合には、トークン分解ユニット１１３は図６のヌル状態の上から伸びる矢印を選択し、この矢印の先の「先頭位置移動」という処理を実行し、そして再びヌル状態に戻る。他の状態（シンボル状態や数値状態）についても、トークン分解ユニット１１３は同様にふるまい動作する。
図６には、四角の箱で表された処理が三種類ある。これの処理の内容について説明する。
・先頭位置移動
・トークン抽出
・文字差し戻し
「先頭位置移動」の処理内容を図７に示す。先頭位置移動において、トークン分解ユニット１１３は、トークン先頭位置を文字取得位置に移動する。図７の例では、行頭にあったトークン先頭位置は、行頭から右へ二文字分移動されている。この処理が呼び出されるのは、以下３つの場合のいずれかである。
・ヌル状態で空白文字を取得したとき
・ヌル状態で記号文字を取得したとき
・シンボル状態あるいは数値状態から「文字差し戻し」処理を経た後
ヌル状態で空白文字を取得したときには、トークン分解ユニット１１３は、新たなトークンを抽出せずに、トークン先頭位置を移動する。これは、空白文字を無視するためである。他の二つの場合では、トークン分解ユニット１１３は、新たなトークンを抽出してから、トークン先頭位置を移動する。トークンを抽出する処理については次に詳しく説明する。
「トークン抽出」の処理内容を図８Ａに示す。トークン抽出において、トークン分解ユニット１１３は、トークン先頭位置から文字取得位置のひとつ手前までの文字列をひとつのトークンとみなす処理を行う。このときのトークン境界判定の状態に基づいて、トークン分解ユニット１１３は、この新たなトークンの種類を決定する。トークン境界判定の状態とトークンの種類の関係は図８Ｂの表のとおりである。つまり、もしトークン境界判定の状態がヌル状態ならば、新たなトークンは記号トークンとなる。同様にして、もし数値状態ならば、新たなトークンは数値トークンとなり、もしシンボル状態ならば、シンボルトークンとなる。
「文字差し戻し」の処理内容を図９に示す。文字差し戻しにおいて、トークン分解ユニット１１３は、文字取得位置を行頭方向に１文字分戻し、次処理に移行する。これは、文字の取得をやり直すためである。文字差し戻しを実行するときは、トークン境界判定の状態が数値状態であって数字以外の文字を取得したときか、もしくはシンボル状態であってシンボル文字以外の文字を取得したときのいずれかである。いずれの場合も、トークン分解ユニット１１３は、現在の状態で処理すべきではない文字を取得しているため、その文字の取得をキャンセルする必要がある。
＜ステップＳ４：トークン情報マッチング＞
つづいて、図１０を参照しながら、ステップＳ４（図２参照）の「トークン情報マッチング」について詳しく説明する。ステップＳ４は、ステップＳ４１からＳ４８の八つのステップを含む。
トークン情報マッチング処理は、トークン情報テーブル１３０を参照しながら、未知命令を構成するトークンの構成パターンに合致する命令を、既知の命令の中から探し出す処理である。命令というものは、ひとつ以上のトークンで構成されている。ここでは、各トークンの文字列や種類、そしてトークンの並び方を、トークンの構成パターンと呼んでいる。トークン情報テーブル１３０は、全ての既知命令のトークンの構成パターンと命令ＩＤとを持つテーブルである。トークン情報テーブル１３０の中から、未知命令のトークンの構成パターンと同じトークンの構成パターンをもつ既知命令を探し出せば、未知命令の命令ＩＤを知ることができる。
ステップＳ４１において、マッチングユニット１１５（図１参照）は、既知の命令ＩＤの中で未検査なものが残っているか否かを確認し、もしそのような既知命令ＩＤが残っていればステップＳ４２へ移動し、もし残っていなければステップＳ４を終了する。
ステップＳ４２において、マッチングユニット１１５は、未検査な既知命令ＩＤをひとつ選択し、その既知命令のトークン情報をトークン情報テーブル１３０（図１参照）から取得する。このとき取得する既知命令のトークン情報には、複数のトークンが含まれる。また、既知命令のシンボルトークンには、オペランド変数を示すものとそうでないものとが存在する。
ステップＳ４３において、マッチングユニット１１５は、既知命令のトークン情報と未知命令のトークン情報からそれぞれひとつずつトークンを取得する。既知命令と未知命令の両方のそれぞれのトークン情報において、先頭の位置にあるトークンから末尾のトークンに向かって順番に０から始まる番号をつけておく。ステップＳ４３において既知命令と未知命令のトークンを取得する際には、同じ番号をもつトークンを取得する。例えば、既知命令と未知命令のそれぞれの先頭のトークンを取得する、それぞれの先頭から２番目のトークンを取得する、それぞれの先頭から３番目のトークンを取得する、といったようにする。
ステップＳ４４において、マッチングユニット１１５は、既知命令のトークンがオペランド変数を示すトークンであるか否かを確認し、もしオペランド変数でなければステップＳ４５へ移行し、もしオペランド変数であればステップＳ４６へ移行する。
ステップＳ４５において、マッチングユニット１１５は、既知命令のトークンと未知命令のトークンの文字列が正確に一致するか否かを検査し、その結果をステップＳ４７へ与える。このステップＳ４５の「文字列一致検査」については後で詳しく説明する。
ステップＳ４６において、マッチングユニット１１５は、既知命令のトークンと未知命令のトークンの意味が一致するか否かを検査し、その結果をステップＳ４７へ与える。このステップＳ４６の「意味一致検査」については後で詳しく説明する。
ステップＳ４７において、マッチングユニット１１５は、ステップＳ４５あるいはステップＳ４６の検査結果を確認し、もしそれが「一致」であるならばステップＳ４８に移行し、もしそれが「不一致」であるならばステップＳ４２に移行する。ステップＳ４２への移行は、現在選択している既知命令が未知命令でなかったことを意味し、マッチングユニット１１５は、別の既知命令を試すことになる。
ステップＳ４８において、マッチングユニット１１５は、既知命令のトークン情報に含まれる全てのトークンについて検査を行なったか否かを確認し、もし検査を行なっていないトークンがあるならばステップＳ４３に移行し、残りのトークンを検査する。もしそうでなければ、マッチングユニット１１５は、既知命令と未知命令の両者のトークンが全て一致したと判断し、その既知命令の命令ＩＤを未知命令の命令ＩＤとする。加えて、マッチングユニット１１５は、ステップＳ４６の「意味一致検査」で得られたオペランドの値を取得し、未知命令の命令ＩＤとオペランド値とを、ステップＳ５（図２参照）へ与える。
トークン情報テーブル１３０には、各既知命令を構成するトークンの数が記録されている。そのトークンの数を使用して、マッチングユニット１１５は、全てのトークンの検査を行ったか否かを確認する。
以上説明したように、ステップＳ４において、マッチングユニット１１５は、全てのトークンに対して、ステップＳ４５の「文字列一致検査」あるいはステップＳ４６の「意味一致検査」を実施し、未知命令の命令ＩＤとオペランド値を抽出する。このようにすることによって、未知命令を構成するトークンの構成パターンと同じ構成パターンをもつ命令を、既知命令の中から探し出すことができる。ステップＳ４では、トークンの構成パターンに関して前提条件を使用していない。例えば、先頭にニモニックを表す文字列が出現するはず、といった前提条件を使用していない。したがって、ニモニック形式でも関数形式でも算術形式でも、トークンの構成パターンが一致しさえすれば、マッチングユニット１１５は未知命令を特定することが可能である。
＜文字列一致検査＞
つづいて、図１１を参照しながら、ステップＳ４５（図１０参照）の「文字列一致検査」について詳しく説明する。
文字列一致検査とは、既知命令と未知命令のそれぞれ対応する位置にあるトークンが、文字列として一致するか否かを検査する処理である。マッチングユニット１１５は、既知命令のトークンがオペランド変数を示していない場合に、文字列一致検査を行なう。
図１１は、既知命令と未知命令のそれぞれの最も右側（行末に近い方）のトークンについて、マッチングユニット１１５が文字列一致検査を行なう処理を示す。図１１に示す例では、既知命令と未知命令はそれぞれ６個のトークンを有している。既知命令のトークンのなかで、“％ｏｐ０”、“％ｏｐ１”、はオペランド変数を表すトークンであり、それ以外のトークン、“＝”、“ＡＢＳ”、“（”、“）”はオペランド変数ではないトークンである。オペランド変数ではないこれらの４個のトークンについて、マッチングユニット１１５は文字列一致検査を行なう。図１１において、既知命令と未知命令の最も右側（行末に近い方）のトークンは、どちらも“）”であるので、マッチングユニット１１５は、両方のトークンの文字列が一致すると判断する。
＜意味一致検査＞
つづいて、図１２を参照しながら、ステップＳ４６（図１０参照）の「意味一致検査」について詳しく説明する。
意味一致検査とは、既知命令と未知命令のそれぞれ対応する位置にあるトークンの意味が一致するか否かを検査する処理である。マッチングユニット１１５は、既知命令のトークンがオペランド変数を表す場合に、意味一致検査を行なう。
ここで、「意味が一致する」とは、オペランド変数が表現可能なシンボルトークンや数値トークンの集合（トークンの候補）に未知命令のトークンが含まれていることを意味する。図１２は、既知命令と未知命令のそれぞれの最も左側（行頭に近い方）のトークンについて、マッチングユニット１１５が意味一致検査を行なう処理を示す。
図１２に示す例では、既知命令のトークンのなかで、“％ｏｐ０”、“％ｏｐ１”、はオペランド変数を表すトークンである。オペランド変数を表すこれらの２個のトークンのそれぞれについて、マッチングユニット１１５は意味一致検査を行なう。図１２において、マッチングユニット１１５は、既知命令の最も左側（行頭に近い方）のトークン“％ｏｐ０”と、未知命令の同じく最も左側のシンボルトークン“Ｒ５”とを比較し、オペランド変数であるトークン“％ｏｐ０”が表すトークンの集合に未知命令のシンボルトークン“Ｒ５”が含まれるか否かを判定する。
マッチングユニット１１５は、既知命令のオペランド変数に関する情報を、オペランド情報テーブル１４０から取り出す。オペランド情報テーブル１４０は、各既知命令のトークン情報の中に含まれるオペランド変数に関する情報（オペランド情報）を保持するテーブルである。オペランド情報とは、以下の五つの情報である。
１．既知命令の命令ＩＤ
２．オペランド変数の名前
３．オペランド変数のタイプ
４．トークンの候補
５．オペランドの値
図１２において、マッチングユニット１１５は、オペランド変数“％ｏｐ０”のオペランド情報をオペランド情報テーブル１４０から取得する。そのオペランド情報に基づくと、“％ｏｐ０”はＲレジスタを表すオペランド変数であり、“％ｏｐ０”のトークン候補は“Ｒ０”から“Ｒ１５”までのレジスタを表すシンボルトークンであることがわかる。したがって、未知命令の同じく最も左側のシンボルトークン“Ｒ５”は、既知命令の最も左側（行頭に近い方）のトークン“％ｏｐ０”が表すトークンの集合に含まれる、とマッチングユニット１１５は判断する。
以上説明したように、本発明を使用すれば、さまざまな記述スタイルに対応できたひとつの汎用な構文解析器を提供できる。また、当該構文解析器を有する汎用アセンブラおよびアセンブル装置を提供できる。
上記アセンブル装置は、トークンの構成パターンを用いて入力文字列に含まれる命令を認識するため、例えば、入力文字列の先頭に命令を現す文字列（トークン）が無い記述スタイルにも対応可能である。また、上記アセンブル装置は、プロセッサの仕様変更等に囚われない利便性の高いアセンブル機能を提供できる。
即ち、本発明によれば、ニモニック形式と関数形式と算術形式の命令記述形式に対応できる構文解析器を有するアセンブル装置、構文解析方法、およびアセンブラプログラムを提供できる。
なお、本発明の具体的な構成は前述の実施の形態に限られるものではなく、この発明の要旨を逸脱しない範囲の変更があってもこの発明に含まれる。
例えば、上記アセンブラは、オプティカルディスクなどの記録媒体に記録保持され、記録媒体から入力部を介してコンピュータに読み込まれることによって、ＣＰＵを動作させてソースファイルをオブジェクトコードに変換し、出力部から出力するようにしてもよい。
また、図１８に例示すように、サーバ上の記録媒体にアセンブラを動作可能に記録保持し、サーバのＣＰＵや記憶部を使用して、アセンブル処理を行なってもよい。
アセンブラは、ＣＰＵやＤＳＰなどのプロセッサのためのプログラム開発に欠かせない開発ツールである。携帯電話、音楽プレーヤ、自動車向けナビシステムなどの組み込み用途に向けてさまざまなＣＰＵやＤＳＰが開発されている。本発明はそうした組み込み向けプロセッサのためのアセンブラに使用できる。
この出願は、２００９年８月２５日に出願された日本出願特願２００９−１９４５７４号を基礎とする優先権を主張し、その開示の全てをここに取り込む。
【符号の説明】
【０００８】
１００  アセンブラ
１１０  構文解析ユニット
１１１  行分解ユニット
１１３  トークン分解ユニット
１１５  マッチングユニット
１２０  命令エンコーダ
１３０  トークン情報テーブル
１４０  オペランド情報テーブル
１５０  オペコードテーブル
２００  ソースファイル
３００  オブジェクトファイル
【図１】
0005413623.tif 000002
【図２】
0005413623.tif 000003
【図３】
0005413623.tif 000004
【図４】
0005413623.tif 000005
【図５】
0005413623.tif 000006
【図６】
0005413623.tif 000007
【図７】
0005413623.tif 000008
【図８Ａ】
0005413623.tif 000009
【図８Ｂ】
0005413623.tif 000010
【図９】
0005413623.tif 000011
【図１０】
0005413623.tif 000012
【図１１】
0005413623.tif 000013
【図１２】
0005413623.tif 000014
【図１３】
0005413623.tif 000015
【図１４Ａ】
0005413623.tif 000016
【図１４Ｂ】
0005413623.tif 000017
【図１５Ａ】
0005413623.tif 000018
【図１５Ｂ】
0005413623.tif 000019
【図１６】
0005413623.tif 000020
【図１７】
0005413623.tif 000021
【図１８】
0005413623.tif 000022