/*                                  * *                                  * *         KMYsofts japanese                 * *         日本語コンパイラ(日本語プログラミング言語)   * *         本製作:かみょーん                * *         iolibなどの提供:富沢高明様            * *                                  * *                                  * */ バージョンは「0.6.6.0」。 #======================================================= #MASMがあるか確認 なければ全ての動作をストップ #======================================================= もし、「\masm32\bin\ml.exe」が存在でなければ、  「KMYsofts japanese {バージョン} ml.exeが確認できませんでした。 ml.exeはMASMのインストールにより生成されるファイルです。 ml.exeがないと全ての動作が出来ない仕様ですので、終了します」と表示して、終わる。 #======================================================= #コマンドラインの判定による事前準備 #======================================================= もし、コマンドライン¥1が空ならば、  「KMYsofts japanese {バージョン} コマンドライン一覧 1つ目の引数:  ファイル名   ファイル名に{カッコ}.jp{カッコ閉じ}の拡張子を   つけたファイルを開いて、ビルドします。  /s   .jpと.ijfをNotepadに関連付けます。 2つ目の引数:  /r   コンパイルのみを行い、アセンブラ、リンクなどを行いません。   プログラムの文法のチェックをやりたい方にお勧めです。   また、アセンブリのための余計なメモリを使わずOKと言われたプログラムだけ   安全にアセンブリしたい人にもお勧めです。   なお、Expressを使っていても/cを指定しなくでも正常に動作します。  /o   ソースコード整形のみを行い、コンパイルなどを行いません。   また、整形した結果も出力しません。 2つ目と3つ目と4つ目とちらか:  /w   コンソールが表示されないWINDOWSアプリケーションを作成します。   使用した命令によっては、コンソールが表示されることがあります。 引数を空にした時:  このKMYsofts japaneseのビルド情報が表示されます。 コマンドラインが指定されていません」と表示して、終わる。 もし、コマンドライン¥1が「/s」ならば、  「関連付けを開始します...」と表示。  「HKEY_CLASSES_ROOT\.jp」のレジストリ開いて、Hに代入。  Hで「PerceivedType」に「text」をレジストリ書く。  Hで「」に「KMYsofts japanese Script」をレジストリ書く。  Hのレジストリ閉じる。  「HKEY_CLASSES_ROOT\.ijf」のレジストリ開いて、Hに代入。  Hで「PerceivedType」に「text」をレジストリ書く。  Hで「」に「KMYsofts japanese IncludeFile」をレジストリ書く。  Hのレジストリ閉じる。  「関連付けが完了しました」と表示して、終わる。 もし、コマンドライン¥2が「/r」ならば、  Onlyは、はい。 もし、コマンドライン¥2が「/w」||コマンドライン¥3が「/w」||コマンドライン¥4が「/w」ならば、  窓プログラムははい。 もし、コマンドライン¥1が「/v」ならば、  バージョンを継続表示して、終わる。 #======================================================= #コンパイルの開始 #======================================================= コマンドライン¥1を名前に代入。 iolibは、いいえ。 user32は、いいえ。 kernel32は、いいえ。 shell32は、いいえ。 SYSTEMTIMEは、いいえ。 インクルードは空。 ブロック内訳は空。 変数名一覧は空。 変数対象1は空。 変数対象2は空。 構造体一覧は空。 構造体宣言は空。 文字は0。 ファイルハンドルは0。 現在行は-1。 ブロックは0。 ネストは0。 ブロック中は空。 Elseなしは、空。 反復中は、空。 エラー済みは、いいえ。 終了済みは、いいえ。 割り算済みは、いいえ。 アセンブラ不明データとは文字列。アセンブラ不明データは空。 アセンブラデータとは文字列。アセンブラデータは空。 アセンブラとは文字列。アセンブラは空。 もし、「{名前}.osf」が存在でなければ、  「KMYsofts japanese {バージョン} {名前}.osf 指定されたファイルは存在しません」と表示して、終わる。 「{改行}KMYsofts japanese{バージョン} コンパイル開始」を表示。 もし、「\masm32\include\iolib.inc」が存在でなければ、  「エラー:(START):\masm32\include\iolib.incがインストールされていません」と表示。エラー済みは、はい。 もし、「\masm32\lib\iolib.lib」が存在でなければ、  「エラー:(START):\masm32\lib\iolib.libがインストールされていません」と表示。エラー済みは、はい。 「{名前}.osf」を開いて、反復  直接判定対象は、それ。  現在行は現在行+1。 #======================================================= #言語仕様によるKJからMASMへのコンバード #=======================================================  もし、直接判定対象が「(*)ミリ秒待つ」にワイルドカード一致ならば、   抽出文字列¥0をメッセージに代入。   メッセージを数値変換して、メッセージに代入。   アセンブラに「 invoke Sleep, {メッセージ}」を配列追加。   kernel32は、はい。  違えば、もし、直接判定対象が「(*)秒待つ」にワイルドカード一致ならば、   抽出文字列¥0をメッセージに代入。   メッセージを数値変換して、メッセージに代入。   アセンブラに「 invoke Sleep, {メッセージ*1000}」を配列追加。   kernel32は、はい。  違えば、もし、直接判定対象が「{カッコ}(*){カッコ閉じ}と表示」にワイルドカード一致ならば、   抽出文字列¥0をメッセージに代入。   メッセージを変換して、メッセージに代入。   アセンブラデータに「 STR{文字} db "{メッセージ}", 0」を配列追加。   アセンブラに「 invoke OutputString, NEAR32 PTR STR{文字}」を配列追加。   文字は、文字+1。   iolibは、はい。  違えば、もし、直接判定対象が「(*)を表示」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   アセンブラに「 invoke OutputString, NEAR32 PTR {抽出文字列¥0}」を配列追加。   iolibは、はい。  違えば、もし、直接判定対象が「(*)を整数として表示」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   アセンブラに「 invoke OutputInteger, {抽出文字列¥0}」を配列追加。   iolibは、はい。  違えば、もし、直接判定対象が「(*)を文字列として表示」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   アセンブラに「 invoke OutputString, offset {抽出文字列¥0}」を配列追加。   iolibは、はい。  違えば、もし、直接判定対象が「待機」ならば、   アセンブラに「 invoke PauseProgram」を配列追加。   iolibは、はい。  違えば、もし、直接判定対象が「{カッコ}自分{カッコ閉じ}のプロセスを終了」ならば、   アセンブラに「 invoke ExitProcess, 0」を配列追加。   「警告 :({現在行}):プロセスを終了関数の記述は義務ではありません」と表示。   終了済みは、はい。   kernel32は、はい。  違えば、もし、直接判定対象が「終わる」ならば、   アセンブラに「 invoke ExitProcess, 0」を配列追加。   終了済みは、はい。   kernel32は、はい。  違えば、もし、直接判定対象が「{カッコ}(*){カッコ閉じ}と言う」にワイルドカード一致ならば、   抽出文字列¥0をメッセージに代入。   メッセージを変換して、メッセージに代入。   アセンブラデータに「 STR{文字} db "{メッセージ}", 0」を配列追加。   アセンブラに「 invoke MessageBoxA, 0, offset STR{文字}, offset PROJECTNAME, 0」を配列追加。   文字は、文字+1。   user32は、はい。  違えば、もし、直接判定対象が「(*)を言う」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   アセンブラに「 invoke MessageBoxA, 0, offset {抽出文字列¥0}, offset PROJECTNAME, 0」を配列追加。   文字は、文字+1。   user32は、はい。  違えば、もし、直接判定対象が「{カッコ}(*){カッコ閉じ}で二択」にワイルドカード一致ならば、   抽出文字列¥0をメッセージに代入。   メッセージを変換して、メッセージに代入。   アセンブラデータに「 STR{文字} db "{メッセージ}", 0」を配列追加。   アセンブラに「 invoke MessageBoxA, 0, offset STR{文字}, offset PROJECTNAME, 4 mov RETURN, eax push eax mov edx, 5 push edx pop edx pop eax sub eax, edx push eax pop eax mov RETURN, eax」を配列追加。   文字は、文字+1。   user32は、はい。  違えば、もし、直接判定対象が「(*)とは[=整数|ファイルハンドル|変数]」にワイルドカード一致ならば、   アセンブラデータに「 {抽出文字列¥0} dd 0」を配列追加。  違えば、もし、直接判定対象が「(*)とは文字」にワイルドカード一致ならば、   アセンブラデータに「 {抽出文字列¥0} db 8 dup(0), 0」を配列追加。  違えば、もし、直接判定対象が「(*)とは半角文字」にワイルドカード一致ならば、   アセンブラデータに「 {抽出文字列¥0} db 4 dup(0), 0」を配列追加。  違えば、もし、直接判定対象が「(*)とは文字列」にワイルドカード一致ならば、   アセンブラ不明データに「 {抽出文字列¥0} db ?」を配列追加。  /*違えば、もし、直接判定対象が「(*)とは文字列」にワイルドカード一致ならば、   アセンブラデータに「 {抽出文字列¥0} db 1024 dup(0), 0」を配列追加。  違えば、もし、直接判定対象が「(*)とは文字列。(最大バイトは(*))」にワイルドカード一致ならば、   アセンブラデータに「 {抽出文字列¥0} db {抽出文字列¥1} dup(0), 0」を配列追加。*/  違えば、もし、直接判定対象が「(*)とは(*)の仮の姿」にワイルドカード一致ならば、   変数対象1に抽出文字列¥0を配列追加。   変数対象2に抽出文字列¥1を配列追加。  違えば、もし、直接判定対象が「(*)とは現在時刻」にワイルドカード一致ならば、   アセンブラに「 local {抽出文字列¥0}:SYSTEMTIME」を配列追加。   SYSTEMTIMEは、はい。  違えば、もし、直接判定対象が「(*)に(*)を入れる」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   アセンブラに「 mov edx, {抽出文字列¥1} push edx pop eax mov {抽出文字列¥0}, eax」を配列追加。  違えば、もし、直接判定対象が「整数を聞いて、(*)に入れる」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   アセンブラに「 invoke InputInteger, NEAR32 PTR {抽出文字列¥0}」を配列追加。   iolibは、はい。  違えば、もし、直接判定対象が「文字を聞いて、(*)に入れる」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   アセンブラに「 invoke InputString, NEAR32 PTR {抽出文字列¥0}」を配列追加。   iolibは、はい。  違えば、もし、直接判定対象が「クリップボードを空にする」ならば、   アセンブラに「 invoke OpenClipboard, 0 invoke EmptyClipboard invoke CloseClipboard」を配列追加。   user32は、はい。  違えば、もし、直接判定対象が「{カッコ}(*){カッコ閉じ}のファイルを開いて、ハンドルを(*)に入れる」にワイルドカード一致ならば、   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   アセンブラデータに「 FILEH{ファイルハンドル} db "{抽出文字列¥0}", 0」を配列追加。   アセンブラに「 invoke CreateFileA, addr FILEH{ファイルハンドル}, 3221225472, 3, 0, 4, 128, 0 mov {抽出文字列¥1}, eax」を配列追加。   ファイルハンドルはファイルハンドル+1。   kernel32は、はい。  違えば、もし、直接判定対象が「ハンドル(*)のファイルを閉じる」にワイルドカード一致ならば、   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   アセンブラに「 invoke CloseHandle, {抽出文字列¥0}」を配列追加。   kernel32は、はい。  違えば、もし、直接判定対象が「ハンドル(*)のファイルからバイト(*)の中身を読んで、(*)に入れる」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列¥2の変数正体検査して、抽出文字列¥2に代入。   アセンブラに「 invoke GlobalAlloc, 64, {抽出文字列¥1} mov KEAX, eax invoke GlobalLock, KEAX mov KEBX, eax invoke ReadFile, {抽出文字列¥0}, offset {抽出文字列¥2}, {抽出文字列¥1}, addr RETURN, 0 invoke GlobalUnlock, KEBX invoke GlobalFree, KECX」を配列追加。   文字は文字+1。   kernel32は、はい。  違えば、もし、直接判定対象が「ハンドル(*)のファイルにバイト(*)である{カッコ}(*){カッコ閉じ}を書く」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥2を変換して、メッセージに代入。   抽出文字列¥1を数値変換して、抽出文字列¥1に代入。   アセンブラデータに「 FILEH{ファイルハンドル} db "{メッセージ}", 0」を配列追加。   アセンブラに「 invoke GlobalAlloc, 64, {抽出文字列¥1} mov KEAX, eax invoke GlobalLock, KEAX mov KEBX, eax invoke WriteFile, {抽出文字列¥0}, offset FILEH{ファイルハンドル}, {抽出文字列¥1}, addr RETURN, 0 invoke GlobalUnlock, KEBX invoke GlobalFree, KECX」を配列追加。   ファイルハンドルはファイルハンドル+1。   kernel32は、はい。  違えば、もし、直接判定対象が「{カッコ}(*){カッコ閉じ}のファイルを空にする」にワイルドカード一致ならば、   アセンブラデータに「 FILEH{ファイルハンドル} db "{抽出文字列¥0}", 0」を配列追加。   アセンブラに「 invoke CreateFileA, addr FILEH{ファイルハンドル}, 3221225472, 3, 0, 5, 128, 0 mov KEAX, eax invoke CloseHandle, KEAX」を配列追加。   ファイルハンドルはファイルハンドル+1。   kernel32は、はい。  違えば、もし、直接判定対象が「ハンドル(*)のファイルサイズ調査して、(*)に入れる」にワイルドカード一致ならば、   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   アセンブラに「 invoke GetFileSize, {抽出文字列¥0}, 0 mov {抽出文字列¥1}, eax」を配列追加。   kernel32は、はい。  違えば、もし、直接判定対象が「{カッコ}(*){カッコ閉じ}から{カッコ}(*){カッコ閉じ}へファイルコピー」にワイルドカード一致ならば、   アセンブラデータに「 FILEH{ファイルハンドル} db "{抽出文字列¥0}", 0 FILEH{ファイルハンドル+1} db "{抽出文字列¥1}", 0」を配列追加。   アセンブラに「 invoke CopyFileA, offset FILEH{ファイルハンドル}, offset FILEH{ファイルハンドル+1}, 0」を配列追加。   ファイルハンドルはファイルハンドル+2。   kernel32は、はい。  違えば、もし、直接判定対象が「{カッコ}(*){カッコ閉じ}をファイル完全削除」にワイルドカード一致ならば、   アセンブラデータに「 FILEH{ファイルハンドル} db "{抽出文字列¥0}", 0」を配列追加。   アセンブラに「 invoke DeleteFileA, offset FILEH{ファイルハンドル}」を配列追加。   ファイルハンドルはファイルハンドル+1。   kernel32は、はい。  違えば、もし、直接判定対象が「{カッコ}(*){カッコ閉じ}[=に|へ|の]フォルダ作成」にワイルドカード一致ならば、   アセンブラデータに「 FILEH{ファイルハンドル} db "{抽出文字列¥0}", 0」を配列追加。   アセンブラに「 invoke CreateDirectoryA, offset FILEH{ファイルハンドル}, 0」を配列追加。   ファイルハンドルは、ファイルハンドル+1。   kernel32は、はい。  違えば、もし、直接判定対象が「(*)[=+|+][==|=](*)」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   アセンブラに「 mov eax, {抽出文字列¥0} push eax mov edx, {抽出文字列¥1} push edx pop edx pop eax add eax, edx push eax pop eax mov {抽出文字列¥0}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)[=-|ー][==|=](*)」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   アセンブラに「 mov eax, {抽出文字列¥0} push eax mov edx, {抽出文字列¥1} push edx pop edx pop eax sub eax, edx push eax pop eax mov {抽出文字列¥0}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)[=*|*|×][==|=](*)」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列を数値変換して、抽出文字列に代入。   アセンブラに「 mov eax, {抽出文字列¥0} mov edx, {抽出文字列¥1} push eax push edx pop edx pop eax mul edx push eax pop eax mov {抽出文字列¥0}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)[=/|/|÷][==|=](*)」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列を数値変換して、抽出文字列に代入。   アセンブラに「 push {抽出文字列¥0} push {抽出文字列¥1} pop ebx pop eax mov edx, 0 div ebx push eax pop eax mov {抽出文字列¥0}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)[==|=](*)[=+|+](*)」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列¥2の変数正体検査して、抽出文字列¥2に代入。   抽出文字列を数値変換して、抽出文字列に代入。   アセンブラに「 mov eax, {抽出文字列¥1} push eax mov edx, {抽出文字列¥2} push edx pop edx pop eax add eax, edx push eax pop eax mov {抽出文字列¥0}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)[==|=](*)[=-|ー](*)」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列¥2の変数正体検査して、抽出文字列¥2に代入。   抽出文字列を数値変換して、抽出文字列に代入。   アセンブラに「 mov eax, {抽出文字列¥1} push eax mov edx, {抽出文字列¥2} push edx pop edx pop eax sub eax, edx push eax pop eax mov {抽出文字列¥0}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)[=+|+][=+|+]」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列¥2の変数正体検査して、抽出文字列¥2に代入。   抽出文字列を数値変換して、抽出文字列に代入。   アセンブラに「 mov eax, {抽出文字列¥0} push eax mov edx, 1 push edx pop edx pop eax add eax, edx push eax pop eax mov {抽出文字列¥0}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)[=-|ー][=-|ー]」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列¥2の変数正体検査して、抽出文字列¥2に代入。   抽出文字列を数値変換して、抽出文字列に代入。   アセンブラに「 mov eax, {抽出文字列¥0} push eax mov edx, 1 push edx pop edx pop eax sub eax, edx push eax pop eax mov {抽出文字列¥0}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)[==|=](*)[=*|*|×](*)」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列¥2の変数正体検査して、抽出文字列¥2に代入。   抽出文字列を数値変換して、抽出文字列に代入。   アセンブラに「 mov eax, {抽出文字列¥1} mov edx, {抽出文字列¥2} push eax push edx pop edx pop eax mul edx push eax pop eax mov {抽出文字列¥0}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)[==|=](*)[=/|/|÷](*)」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列¥2の変数正体検査して、抽出文字列¥2に代入。   抽出文字列を数値変換して、抽出文字列に代入。   アセンブラに「 push {抽出文字列¥1} push {抽出文字列¥2} pop ebx pop eax mov edx, 0 div ebx push eax pop eax mov {抽出文字列¥0}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)と(*)を足して、(*)に入れる」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列¥2の変数正体検査して、抽出文字列¥2に代入。   抽出文字列を数値変換して、抽出文字列に代入。   アセンブラに「 mov eax, {抽出文字列¥0} push eax mov edx, {抽出文字列¥1} push edx pop edx pop eax add eax, edx push eax pop eax mov {抽出文字列¥2}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)から(*)を引いて、(*)に入れる」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列¥2の変数正体検査して、抽出文字列¥2に代入。   抽出文字列を数値変換して、抽出文字列に代入。   アセンブラに「 mov eax, {抽出文字列¥0} push eax mov edx, {抽出文字列¥1} push edx pop edx pop eax sub eax, edx push eax pop eax mov {抽出文字列¥2}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)と(*)を掛けて、(*)に入れる」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列¥2の変数正体検査して、抽出文字列¥2に代入。   抽出文字列を数値変換して、抽出文字列に代入。   アセンブラに「mov eax, {抽出文字列¥0} mov edx, {抽出文字列¥1} push eax push edx pop edx pop eax mul edx push eax pop eax mov {抽出文字列¥2}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)から(*)を割って、(*)に入れる」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   抽出文字列¥2の変数正体検査して、抽出文字列¥2に代入。   抽出文字列を数値変換して、抽出文字列に代入。   アセンブラに「 push {抽出文字列¥0} push {抽出文字列¥1} pop ebx pop eax mov edx, 0 div ebx push eax pop eax mov {抽出文字列¥2}, eax」を配列追加。   割り算済みは、はい。  違えば、もし、直接判定対象が「(*)から(*)へ値を移す」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。   アセンブラに「 push {抽出文字列¥0} pop eax mov {抽出文字列¥1}, eax」を配列追加。  違えば、もし、直接判定対象が「(*)[==|=](*)」にワイルドカード一致ならば、   抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。   抽出文字列¥1を数値変換して、抽出文字列¥1に代入。   アセンブラに「 mov edx, {抽出文字列¥1} push edx pop eax mov {抽出文字列¥0}, eax」を配列追加。  違えば、もし、直接判定対象が「もし、(*)ならば(」にワイルドカード一致ならば、   ブロックはブロック+1。   ネストはネスト+1。   ブロック中¥ネストはブロック。   ブロック内訳¥ネストは「条件分岐」。   Elseなし¥ネストははい。   アセンブラに「_block{ブロック中¥ネスト}:」を配列追加。   メッセージは抽出文字列¥0。   もし、メッセージが「(*)が(*)以外」にワイルドカード一致ならば、    抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。    抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。    アセンブラに「 push {抽出文字列¥0} push {抽出文字列¥1} pop eax pop ebx cmp ebx, eax jne _true{ブロック中¥ネスト} jmp _false{ブロック中¥ネスト} _true{ブロック中¥ネスト}:」を配列追加。   違えば、もし、メッセージが「(*)が(*)より大きい」にワイルドカード一致ならば、    抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。    抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。    アセンブラに「 push {抽出文字列¥0} push {抽出文字列¥1} pop eax pop ebx cmp ebx, eax jg _true{ブロック中¥ネスト} jmp _false{ブロック中¥ネスト} _true{ブロック中¥ネスト}:」を配列追加。   違えば、もし、メッセージが「(*)が(*)より小さい」にワイルドカード一致ならば、    抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。    抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。    アセンブラに「 push {抽出文字列¥0} push {抽出文字列¥1} pop eax pop ebx cmp ebx, eax jl _true{ブロック中¥ネスト} jmp _false{ブロック中¥ネスト} _true{ブロック中¥ネスト}:」を配列追加。   違えば、もし、メッセージが「(*)が(*)以上」にワイルドカード一致ならば、    抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。    抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。    アセンブラに「 push {抽出文字列¥0} push {抽出文字列¥1} pop eax pop ebx cmp ebx, eax jge _true{ブロック中¥ネスト} jmp _false{ブロック中¥ネスト} _true{ブロック中¥ネスト}:」を配列追加。   違えば、もし、メッセージが「(*)が(*)以下」にワイルドカード一致ならば、    抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。    抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。    アセンブラに「 push {抽出文字列¥0} push {抽出文字列¥1} pop eax pop ebx cmp ebx, eax jle _true{ブロック中¥ネスト} jmp _false{ブロック中¥ネスト} _true{ブロック中¥ネスト}:」を配列追加。   違えば、もし、メッセージが「(*)が(*)」にワイルドカード一致ならば、    抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。    抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。    アセンブラに「 push {抽出文字列¥0} push {抽出文字列¥1} pop eax pop ebx cmp ebx, eax je _true{ブロック中¥ネスト} jmp _false{ブロック中¥ネスト} _true{ブロック中¥ネスト}:」を配列追加。  違えば、もし、直接判定対象が「)をして、違えば(」ならば   もし、Elseなし¥ネストがはいならば    アセンブラに「 jmp _end{ブロック中¥ネスト} _false{ブロック中¥ネスト}:」を配列追加。    Elseなし¥ネストは、いいえ。  違えば、もし、直接判定対象が「)をする」ならば   もし、Elseなし¥ネストがはいならば    アセンブラに「_false{ブロック中¥ネスト}:」を配列追加。   もし、ブロック内訳¥ネストが「条件分岐」ならば、    アセンブラに「_end{ブロック中¥ネスト}:」を配列追加。   違えば、もし、ブロック内訳¥ネストが「繰り返し」ならば、    アセンブラに「 jmp _block{ブロック中¥ネスト} _end{ブロック中¥ネスト}:」を配列追加。   Elseなし¥ネストは、いいえ。   ネストは、ネスト-1。  違えば、もし、直接判定対象が「(*)間(」にワイルドカード一致ならば、   ブロックはブロック+1。   ネストはネスト+1。   ブロック中¥ネストは、ブロック。   ブロック内訳¥ネストは「繰り返し」。   Elseなし¥ネストは、いいえ。   アセンブラに「_block{ブロック中¥ネスト}:」を配列追加。   もし、抽出文字列¥0が「(*)が(*)以下の」にワイルドカード一致ならば、    抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。    抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。    アセンブラに「 push {抽出文字列¥0} push {抽出文字列¥1} pop eax pop ebx cmp ebx, eax jle _true{ブロック中¥ネスト} jmp _end{ブロック中¥ネスト} _true{ブロック中¥ネスト}:」を配列追加。   違えば、もし、抽出文字列¥0が「(*)が(*)以上の」にワイルドカード一致ならば、    抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。    抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。    アセンブラに「 push {抽出文字列¥0} push {抽出文字列¥1} pop eax pop ebx cmp ebx, eax jge _true{ブロック中¥ネスト} jmp _end{ブロック中¥ネスト} _true{ブロック中¥ネスト}:」を配列追加。   違えば、もし、抽出文字列¥0が「(*)が(*)より大きい」にワイルドカード一致ならば、    抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。    抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。    アセンブラに「 push {抽出文字列¥0} push {抽出文字列¥1} pop eax pop ebx cmp ebx, eax jg _true{ブロック中¥ネスト} jmp _end{ブロック中¥ネスト} _true{ブロック中¥ネスト}:」を配列追加。   違えば、もし、抽出文字列¥0が「(*)が(*)より小さい」にワイルドカード一致ならば、    抽出文字列¥0の変数正体検査して、抽出文字列¥0に代入。    抽出文字列¥1の変数正体検査して、抽出文字列¥1に代入。    アセンブラに「 push {抽出文字列¥0} push {抽出文字列¥1} pop eax pop ebx cmp ebx, eax jl _true{ブロック中¥ネスト} jmp _end{ブロック中¥ネスト} _true{ブロック中¥ネスト}:」を配列追加。  違えば、もし、直接判定対象が「●(*)[*   ](」にワイルドカード一致ならば、   インクルードに「{抽出文字列¥0} proto」を配列追加。   アセンブラに「{抽出文字列¥0} proc」を配列追加。   最終関数名は抽出文字列¥0。  違えば、もし、直接判定対象が「)●」ならば、   アセンブラに「 ret {最終関数名} endp」を配列追加。  違えば、もし、直接判定対象が「[=&|&](*)」にワイルドカード一致ならば、   アセンブラに「 invoke {抽出文字列¥0}」を配列追加。  違えば、もし、直接判定対象が「{カッコ}(*.exe){カッコ閉じ}を起動」にワイルドカード一致ならば、   アセンブラデータに「 STR{文字} db "{抽出文字列¥0}", 0」を配列追加。   アセンブラに「 invoke ShellExecute, 0, 0, offset STR{文字}, 0, 0, 10」を配列追加。   文字は文字+1。   shell32は、はい。  違えば、もし、直接判定対象が「{カッコ}(*){カッコ閉じ}を起動」にワイルドカード一致ならば、   アセンブラデータに「 STR{文字} db "{抽出文字列¥0}", 0 STR{文字+1} db "open", 0」を配列追加。   アセンブラに「 invoke ShellExecute, 0, offset STR{文字+1}, offset STR{文字}, 0, 0, 10」を配列追加。   文字は文字+2。   shell32は、はい。  違えば、もし、直接判定対象が「※(*)」にワイルドカード一致ならば、   アセンブラに「_{抽出文字列¥0}:」を配列追加。  違えば、もし、直接判定対象が「(*)へ飛ぶ」にワイルドカード一致ならば、   アセンブラに「 jmp _{抽出文字列¥0}」を配列追加。  違えば、もし、直接判定対象が「改行」ならば、   アセンブラに「 invoke OutputLetter, 13 invoke OutputLetter, 10」を配列追加。   iolibは、はい。  違えば、もし、直接判定対象が「現在を取得して、(*)に入れる」にワイルドカード一致ならば、   アセンブラに「 invoke GetLocalTime, addr {抽出文字列¥0}」を配列追加。   kernel32は、はい。  違えば、もし、直接判定対象が「コンマ」ならば、   アセンブラに「 invoke OutputLetter, 44」を配列追加。   iolibは、はい。  違えば、もし、直接判定対象が「プロジェクト名」ならば、   アセンブラに「 invoke OutputString, offset ProjectName」を配列追加。   iolibは、はい。  違えば、もし、直接判定対象が「ビープ」ならば、   アセンブラに「 invoke MessageBeep, 0」を配列追加。   user32は、はい。  違えば、もし、直接判定対象が「ベル」ならば、   アセンブラに「 invoke OutputLetter, 7」を配列追加。   「警告 :({現在行}):ベルを鳴らすには{カッコ}ビープ{カッコ閉じ}を使ってください」と表示。   iolibは、はい。  違えば、もし、直接判定対象が空でなければ、   「エラー:({現在行}):定義されていないトークンが存在します」と表示。エラー済みは、はい。  もし、終了済みがはいならば、   「警告 :({現在行}):終了後の記述があります」と表示。 #======================================================= #コンパイルのととめ(?) #======================================================= もし、終了済みがいいえならば、  アセンブラに「 invoke ExitProcess, 0」を配列追加。  kernel32は、はい。 もし、エラー済みがはいならば、  「{改行}コンパイルは異常終了しました」と表示して、終わる。 もし、iolibがはいならば、インクルードに「include iolib.inc{\n}includelib iolib.lib」を配列追加。 もし、user32がはいならば、インクルードに「include user32.inc{\n}includelib user32.lib」を配列追加。 もし、kernel32がはいならば、インクルードに「include kernel32.inc{\n}includelib kernel32.lib」を配列追加。 もし、shell32がはいならば、インクルードに「include shell32.inc{\n}includelib shell32.lib」を配列追加。 もし、SYSTEMTIMEがはいならば、構造体宣言に「SYSTEMTIME STRUCT wYear WORD ? wMonth WORD ? wDayOfWeek WORD ? wDay WORD ? wHour WORD ? wMinute WORD ? wSecond WORD ? wMilliseconds WORD ? SYSTEMTIME ENDS」を配列追加。 「{改行}コンパイルは正常終了しました{改行}」と表示。 //もし、名前が「(*)onesjp」にワイルドカード一致ならば、 // 名前は抽出文字列¥0。 「.586 .model flat, stdcall {インクルード} {構造体宣言} .data RETURN dd 0 KEAX dd 0 KEBX dd 0 KECX dd 0 KEDX dd 0 PROJECTNAME db "{名前}", 0 {アセンブラデータ} .data? {アセンブラ不明データ} .code _start: {アセンブラ} end _start 」を「{名前}.asm」に保存。 もし、Onlyがはいならば、終わる。 もし、GUIがはいならば、終わる。 もし、窓プログラムがはいならば、  「makejapanese.bat "{名前}" "{母艦パス}" "{作業フォルダ}" "{作業フォルダ}{名前}"」を起動して、終わる。 「makejapanese.bat "{名前}" "{母艦パス}" "{作業フォルダ}" "{作業フォルダ}{名前}"」を起動して、終わる。 ●変換(メッセージを)  Sはメッセージ。  もし、Sが「*%」にワイルドカード一致ならば、   「エラー:({現在行}):メッセージの最後に特殊変数を挿入しました」と表示。エラー済みは、はい。  もし、Sが「%*」にワイルドカード一致ならば、   「エラー:({現在行}):メッセージの先頭に特殊変数を挿入しました」と表示。エラー済みは、はい。  もし、Sが「*%\fn%*」にワイルドカード一致ならば、   「警告 :({現在行}):%\n%と同じコードを出力します」と表示。  Sの「%\n%」を「", 13, 10, "」に置き換えて、Sに代入。  Sの「%\fn%」を「", 13, 10, "」に置き換えて、Sに代入。  Sの「%ProjectName%」を名前に置き換えて、Sに代入。  Sの「%\a%」を「", 7, "」に置き換えて、Sに代入。  Sの「%cma%」を「", 44, "」に置き換えて、Sに代入。  Sの「%\\%」を「", 92, "」に置き換えて、Sに代入。  Sの「%\"%」を「", 34, "」に置き換えて、Sに代入。  Sの「%\%%」を「", 37, "」に置き換えて、Sに代入。  それはS。 ●数値変換(Sを)  Sの「0」を「0」に置き換えて、Sに代入。  Sの「1」を「1」に置き換えて、Sに代入。  Sの「2」を「2」に置き換えて、Sに代入。  Sの「3」を「3」に置き換えて、Sに代入。  Sの「4」を「4」に置き換えて、Sに代入。  Sの「5」を「5」に置き換えて、Sに代入。  Sの「6」を「6」に置き換えて、Sに代入。  Sの「7」を「7」に置き換えて、Sに代入。  Sの「8」を「8」に置き換えて、Sに代入。  Sの「9」を「9」に置き換えて、Sに代入。  それはS。 ●変数正体検査(Sの)  変数対象1の0からSを配列検索して、場所に代入。  場所で条件分岐   -1ならば、    それはS。   違えば、    それは変数対象2¥場所。 /*●数字変換(Sを)  Sの「A」を「, 0x41」に置き換えて、Sに代入。  Sの「あ」を「, 0x82, 0xa0」に置き換えて、Sに代入。  Sを「, (*)」にワイルドカードマッチ。Sは「{抽出文字列¥0}, 0x00」。  それはS。 ●変数本名検出(Sの)  変数名一覧の0からSを配列検索。  それは「HENSUU{それ}」。*/