【単純なスクリプトエンジン(1文字インタープリター)】
スクリプトエンジンで、直接 txt を読み込む場合
●言語仕様
レジスタを r0 番から r255番まで作る。
有効数字は 0 〜 255。
インタープリター形式。
命令やパラメーターの区切りには space/tab を使いう。選択肢同士の区切りは ',' を使う。
行の終わりは改行で終わる ( 参考までに c 言語は ';' で終わる )。
行は、ラベルの行と、命令の行に分かれる。
スクリプトエンジンはコマンドライン用。
●細かい使用
ラベルの解決は毎回する。
データーエリアと命令エリアは分岐しない
最初の1文字を読み込めば、命令の見当が付き、殆ど文脈から判断することはない。
●命令リスト
○メッセージ(message)
文字と文字の区切りに space/tab を用いるので、メッセージ中に半角の space/tab は使用できない
m メッセージ
○レジスタセット(let)
r レジスタ番号 演算子 数字、もしくはレジスタ番号(即値/レジスタ番号)
r r20 = 20
r r20 = r10
r r20 + r30
r r20 - 100
r r20 / 5
r r20 * 5
○ラベル(label)
行頭で : がつく場合のみ
:start
:end
○ジャンプ(goto)
g start
○条件分岐(if)
i r20 = 10 start
i r20 > 10 start
i r20 < 10 start
i r20 ! 10 start
○終了命令(exit)
e
○grphロード
f filename
この命令は、サンプル命令なのでファイルネームを表示するだけです
○選択肢(select)
s r20 選択肢1,選択肢2,選択肢3
○コメント
;コメント
●処理の流れ
(1) ファイルをメモリーに読み込み、ファイルの最後に eof を付ける
(2) eof の場合、終了
(3) 行頭が : の場合にはラベル。その場所では改行を探し、次の行へ行き (2) へ戻る
(4) space/tab の読み飛ばし
(5) e の場合、終了
(6) 改行コードの場合、次の行へ行き (2) へ戻る
(7) ; の場合には改行を探し、次の行へ行き (2) へ戻る
(8) g ラベルを読み込み、行の最初から該当する行を探して、現在の行をそこへ移動させる
(9) i の場合には条件を調べて、条件が合わない場合、行の残りを全てスキップし、次の行へ行き (2) へ戻る。
条件が合う場合ラベルを読み込み、行の最初から該当する行を探して、現在の行をそこへ移動させる
(10)m l f s の場合にはおのおのの命令実行後、次の行へ行き (2) へ戻る
●注意する点
命令やパラメーターの区切りを気を付けること。
たとえば、s 命令の選択肢同士は ',' で区切られているが、他の場合には space/tab で区切る。
●サンプルソース(windowsのコマンドラインプロンプト用)
DOWNLOAD
●改良できる場所1
r 命令を改良する。
r 命令では、左辺に必ずレジスターが来るので、
r r20 = 20
ではなく r を無くして
r20 = 20
とした方が記述性が上がる
●改良できる場所2
1で改良した部分だが、
r20 = 20
ではなく
r20=20
とした方が記述性が上がる。space/tab のスキップをなくせばいい。
同様に i 命令の
i r20 = 20 label
を
i r20=20 label
に変更する。
そして、'<=' と '>=' の記述を出来るようにする。
幸い、'<' や '>' の後にはレジスタか即値しか来ないので、次の文字をチェックするだけだ。
●サンプルソース(windowsのコマンドラインプロンプト用)
DOWNLOAD
●改造後の言語仕様
行は、ラベルの行、命令の行、計算式の行の三種類に分かれる
●改造後の命令リスト
○フラグセット(let)
レジスタ番号 演算子 数字、もしくはレジスタ番号(即値/レジスタ番号)
r20=20
r20=r10
r20+r30
r20-100
r20/5
r20*5
○条件分岐(if)
i r20=10 start
i r20>10 start
i r20<10 start
i r20>=10 start
i r20<=10 start
●大きな懸念事項
毎回、命令の為に文字を読み込むので実行スピードが遅くなる。
ラベルの解決を毎回し直すので、g 命令と i 命令の実行スピードが遅くなる。