【文字の切りだし】
より見やすい言語にしていきたいと思う
●各命令
いままで 1 文字だった物を、文字列にして、よりわかりやすくする。
○レジスタセット(let,命令番号0x00)
レジスタ番号 演算子 数字、もしくはレジスタ番号(即値/レジスタ番号)
r20=100
r20=r10
r20+r30
r20-100
r20/5
r20*5
○メッセージ
文字と文字の区切りに space/tab を用いるので、メッセージ中に半角の space/tab は使用できない
mes メッセージ
○ジャンプ
goto start
○条件分岐
if r20=10 start
if r20!10 start
if r20<10 start
if r20>10 start
if r20<=10 start
if r20>=10 start
○終了命令
exit
○grphロード
load filename
この命令は、サンプル命令なのでファイルネームを表示するだけです
○選択肢
select r20 選択肢1,選択肢2,選択肢3
○ラベル
文字列の最後に : がつく場合。行頭でなくても良い
start:
end:
○コメント
;コメント
●みやすい文法にする
新しい変更点を記する
1)命令を1文字ではなくす
m メッセージ → mes メッセージ
2)ラベルの ':' をラベル名の後に付ける
:label → label:
1)は文字列の切りだしを考えればいい。
2)は、先の文字を判断する必要が出てくる。たとえば、:i と言うラベルは現在ではちゃんと処理される。
しかし、i: とすると、i が if命令の i なのかラベルの i なのかは i の次の文字が ':' かどうかを判別しなくてはならない。
1)の判別のために文字列を切り出すことをトークンの切りだしと言う。これを字句解析という。
2)の文脈の判断は構文解析という。
●文字列の切りだし
文字の切り出しのために、以下の物を設定する。
これらを利用して、文字列の切り出しを行う。
●文字
○英字
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ の中の1文字
半角のアルファベットの中の1文字
○数字
0123456789 の中の1文字
半角の数字の中の1文字
○アンダースコア
'_' 1文字
○全角文字
●文字列
文字が他の物に区切られず続く物。この言語では他の種類の文字が混じっても良い。
例)abc
例)0124
例)a0123
例)__a_
例)あいうabc
●区切
space/tab
●終了記号
eof(0x1b)
●改行コード
cr,lf
lf,cr
cr
lf
●演算子
<=
>=
<
>
!
=
+
-
/
*
●ラベル記号
:
●コメント記号
;
●パラメーターの区切り記号
,
●その他の記号
エラーを発生する
●文字列の切りだし2
load 命令のパラメーターはファイルネームである。
しかし、: がラベル記号として登録されていると、そこで文字列を切られてしまう。
同様に \ など、登録されていない記号でもそうなる。
そこで、トークンの切りだし命令を2種類用意して対応する。
ファイル名、メッセージ、選択肢はこちらを使用する。
選択肢があるので、eof(0x1b) cr lf ',' を区切りとする
●サンプルソース(windowsのコマンドラインプロンプト用)
DOWNLOAD
使用方法は、
>scr02.exe scr02.txt scr02.bin[ret]
でtxtをコンパイルする。
そして、
>scr01a.exe scr02.bin[ret]
でbinを実行する。
scr01a.c は前章の物と全く同じだ。なお、ソースは単独でコンパイルできるように作っている。