本文へジャンプ

 MIFES マクロ
 マクロコマンド書式 制御構造 式について 演算 変数 定数 システム変数 システム関数 機能番号一覧 仮想キー番号一覧
 サンプル1 サンプル2

制御構造

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文の例を参照してください。



リンク


 



お知らせ
  • お知らせが入ります。
  • お知らせが入ります。
  • お知らせが入ります。