制御構造
MIFESマクロの制御分の構造説明です。基本的にC言語を知っていれば簡単に理解できる内容と思います。 処理は代入文や a = a +
1みたいなものや専用に定義されているシステム関数insstr("AAA")文字列挿入などを呼び出せば実行させたい処理が記述できます。システム関数についてはまた後ほど。 ifやwhile、switchも記述はほぼ同じです。違うのは
if 文であれば終わりにendif。whileであれば wend を記述するということでしょうか。
(1) 実行文 (2) if 〜 then 〜 構文 (3) if 〜 else 〜 endif構文 (4) while 〜 wend 構文 (5) switch 〜 case 〜 endsw 構文 (6) goto文 (7) gosub文 (8) return文
MIL/W言語では、以下の制御構造(プログラムの実行順序を指定する記述)をサポートしています。 メモ:以下の一般形の表記の中で、[
と ] で囲った中は省略可能であることを表し、< と > で囲った中は / で区切った中のどれか1つを記述することを表します。
(1) 実行文
変数に値を代入したり関数を実行したりと言った、一般の文です。プログラムの実行の順序を変えるものではありません。
例1.
@6=@str3[@7++]+'A' 例2. insstr("main(argc,argv)") 例3. :sub1
move(@@str3)
実行文とは、式およびgoto文、gosub文、return文、break文、continue文、の総称です。 また、式とは、関数、変数、定数、およびそれらを演算子や括弧(()[])で結んだもの、のいずれかです。詳しくは式についてを参照してください。
(2) if〜then〜構文
条件を満たした場合に1つだけ実行文を実行する構文です。一般形は以下のようになります。
if
式 <then 実行文/goto :ラベル/gosub :ラベル>
例1. if input(@str3,"入力してください")
== 0 then exit()
この構文を正確に言うと、if文の式の後に同一行内で「then
実行文」または「goto文」または「gosub文」が続いた場合には、式の値が 真(0でない)だった時に、その実行文またはgoto文またはgosub文が実行されます。 if文の
then
以降には実行文のみが記述できます。構文(if構文、while構文、switch構文)を記述することはできません。実行文と構文を混同しないようにしてください。
(3) if〜else〜endif構文
条件を満たした場合に複数の文を実行する構文です。一般形は以下のようになります。
if
式 [文] [<else if 式/else>] [文] endif
例1. if
@command == COMMAND_RET insstr(0x0d0a) else if @command ==
COMMAND_BS move("l") delchar(1) else insstr(@char) endif
この構文を正確に言うと、if文の式の後に同一行内で実行文が続かなかった場合には、式の値が真(0でない)だった時に、以降
else または endif
までのすべての文が実行されます。なお、ここでいう文とは、実行文だけでなく構文(if〜then〜構文、if〜else〜endif構文、while〜wend構文、switch〜case〜endsw構文)も含みます。
(4) while〜wend構文
条件を満たす間複数の文を繰り返し実行する構文です。一般形は以下のようになります。
while
式 [文] wend
例1. while @str1[@5] if @str1[@5] ==
',' @str2[@6++] = '/' @str2[@6++] = '/' else if
@str1[@5] < 0x20 break else if @str1[@5] ==
0x7f @5++ continue else @str2[@6++] =
@str1[@5] endif @str2[@6++] = '
' @5++ wend @str2[@6] =
0
while文の式の値が真(0でない)の間、以降 wend
までのすべての文が繰り返し実行されます。なお、ここでいう文とは、実行文だけでなく構文(if〜then〜構文、if〜else〜endif構文、while〜wend構文、switch〜case〜endsw構文)も含みます。 なお、whileとwendの間にあるbreak文は、wendの次の文にジャンプすることを意味します。また、whileとwendの間にあるcontinue文は、以降wendの直前までの文をスキップして、while文の式の評価に移る(次の繰り返しに移る)ことを意味します。
(5) switch〜case〜endsw構文
条件分岐のための構文です。一般形は以下のようになります。
switch
式 case 定数 [case
定数] [文] [break] [default] [文] [break] endsw
例1.
switch @5 case 0 @str3[@6++] =
0x0d0a break case 1 @str3[@6++] =
0x000a break case 2 @str3[@6++] =
0x000d break case 3 case 4 case
5 @str3[@6++] =
0x00fa+@5 break default @str3[@6++] =
0x0040+@5 break endsw
switch〜case〜endsw構文の制御は以下のようになります。 case文の定数の値がswitch文の式の値と同じ時、そのcase文の直後からendswの直前までの文を実行します(途中にbreak文がある時にはそこまでの文を実行します)。 case文の定数の値がswitch文の式の値と異なる時は、次のcase文またはdefault文またはendsw文までジャンプします。 なお、switch文とendsw文の間にあるbreak文は、endsw文の直後にジャンプすることを意味します。 さらに、複数の定数に対して同じ処理を実行したい場合には、case文を続けて記述します。
以上のように、C言語のswitchと全く同じ制御になります。 なお、ここでいう文とは、実行文だけでなく構文(if〜then〜構文、if〜else〜endif構文、while〜wend構文、switch〜case〜endsw構文)も含みます。
(6) goto文
ラベルで指定した文へジャンプする実行文です。ラベルとは分岐先の位置を指定するために文の頭に付けるもので、半角のコロン(:)で始まり最大31バイト(ANKで31文字、漢字で15文字)までの文字列です。ラベルはgoto文やgosub文の分岐先になる文にのみ付けます。またラベル名中の半角英字(A〜Z)は、大文字と小文字は区別しません。
例1.
if @1 < 0 goto :error ・ ・ ・ :error
clsmess() exit()
注意)1つのマクロコマンドに付き、使用できるgoto文およびgosub文の数は最大で100個までです。
(7) gosub文
ラベルで指定されたサブルーチンへジャンプする実行文です。この時、gosub文の次の文の位置を専用のスタックに記録します。 サブルーチンからは、return文でgosub文の次の文の位置に戻ります。 なお、ラベルとは分岐先の位置を指定するために文の頭に付けるもので、半角のコロン(:)で始まり最大31バイト(ANKで31文字、漢字で15文字)までの文字列です。ラベルはgoto文やgosub文の分岐先になる文にのみ付けます。またラベル名中の半角英字(A〜Z)は、大文字と小文字は区別しません。
例1. gosub
:gethex if @3 > 0 then @10 =
@4 ・ ・ ・ :gethex @4 =
0 while 1 @5 = @code if @5 >= '0' &&
@5 <= '9' @4 = (@4<<4)+(@5-'0') else if @5 >=
'A' && @5 <= 'F' @4 =
(@4<<4)+(@5-0x37) else if @5 >= 'a' && @5 <=
'f' @4 =
(@4<<4)+(@5-0x57) else break endif move("r") wend return
注意)1つのマクロコマンドに付き、使用できるgoto文およびgosub文の数は最大で100個までです。
(8) return文
gosub文と対で使用します。gosub文で呼び出したサブルーチンを終了し、gosub文の次の文の位置に戻ります。gosub文の例を参照してください。
リンク
|