MikoScript 言語仕様

 字句要素

●文字コード
本言語のソースプログラムの文字コードには、ASCII と Shift-JIS を使用します。
EUC, UNICODE 等は、現バージョンでは扱っていません。
改行コードは、通常、ASCIIコードの CR/LF になりますが、
LF 単独でも、改行コードとして認識します。しかし、
CR 単独では、改行コードとして認識しません。
空白コードは、ASCIIコードの SP, HT, VT, FF, CR と上記の改行コードになります。
これ以外の ASCII 制御コードや、全角の空白文字は、空白コードとして扱いません。
どの空白コードが何個連続していても、文法上はひとつの空白と同じです。

●コメント
コメント(注釈)には、以下の2通りの表記形態があります。
    // から改行コードの直前まで
    /* から */ までの間(この中には改行コードが含まれても良い)
このコメント部には、通常、プログラムの説明や注釈などを書きます。
このコメント部は、プログラムの翻訳時には全て読み飛ばされるので、
プログラムの実行内容には全く影響しません。
このコメントの表記形態は、基本的に、C++ 言語と同様です。
コメントに関して、若干注意することがあります。
コメントは、1つの字句要素の途中には挿入できないということです。
たとえば、ABC/*...*/XYZ は、ABCXYZ という1つの字句要素になるのではなく、
ABC と XYZ という2つの字句要素に分かれてしまいます。
コメントは基本的に空白が入れる所にのみ挿入可能です。

●マクロ
マクロは、以下の表記形態になります。
    #マクロ名 ...
マクロは、以下の役割を果たします。
    マクロ定義 ・・・・ マクロ展開される文字列を定義する
    マクロ展開 ・・・・ そのマクロ部を定義された文字列に置き換える
    ファイル取込み ・・ そのマクロ部を指定ファイルの内容に置き換える
これらのマクロ処理は、プログラムの翻訳時に行なわれ、それによって
置き換わったテキストがあらたに翻訳の対象になります。
マクロに関しては、「マクロ」の章で詳しく説明します。

●字句要素
 ソースプログラムは、翻訳時に、コメントが除去されて、マクロ処理された後は、一連
の字句要素列になります。本言語の字句要素には、以下の種類があります。
    ・識別名
    ・定値
    ・演算子
    ・予約語
    ・その他
これらの字句要素に関して、以下に説明します。

●識別名
識別名は、各種の対象(箱、ラベル、マクロなど)を特定するために付ける名前です。
識別名は、他のプログラミング言語では「識別子」と言われる場合もあります。
識別名は、以下の文字の並びで形成されます。
    ・アルファベット A〜Z a〜z
    ・数字 0123456789
    ・下線 _
    ・全角文字
    ・半角カタカナ
    ・疑問符 ?
    ・感嘆符 !

但し、以下の制約があります。
    ・識別名の最初の文字は、アルファベット、下線、全角文字、半角カタカナに限る
    ・アルファベットの大文字と小文字は異なる文字として扱う
     (一般に、識別名では、文字コードが異なれば、異なる文字として扱う)
    ・疑問符と感嘆符は、識別名の最後の文字にのみ使用可
     (というよりも、疑問符と感嘆符は、識別名の終端として扱う)
    ・識別名の長さは半角単位で最大 8192 字まで(全角は半角2字に相当)
     (最大字数を越えた部分は単に無視されるだけで、エラーにはならない)
    ・マクロ関連の識別名には、疑問符と感嘆符は使えない
    ・予約語は、識別名には使えない

識別名として有効な例:
    A   xyz   D51   MAX_VALUE   Active?   標準値

識別名として無効な例:
    2B              ・・・ 数字は先頭にできない
    Context-Type    ・・・ ハイフン(マイナス記号)は使用不可
    case            ・・・ 予約語は識別名にできない

本言語の識別名は、命名対象の種類によって、特別な制約が付くということはありません。
例えば、ローカル変数は英小文字で始めるとか、定数名は英大文字にするとかの制約は、
いっさいありません。これらは、慣習やコーディング規約上の制約にはなっても、文法上
の制約ではありません。

疑問符を最後の文字にした識別名は、通常、真偽値を表わす対象の命名に使用しますが、
これも文法上の制約ではありませんが、この用途に限定した方が良いでしょう。識別名の
次に、演算子の ? を使う場合、両者の間に空白を入れないと、その ? は、識別名の最後
の文字として扱われてしまうので注意が必要です。また、感嘆符 ! の場合も、識別名の
末尾と演算子の区別が必要です。

●定値
定値は、一定の値を表す表記形態(リテラル)です。定値には、以下の種類があります。
    ・定数
    ・定文字列
    ・null

●定数
定数は、一定の数値を表します。定数には、以下の3種類があります。
    ・整数定数
    ・浮動小数点定数(実数定数)
    ・文字定数

●整数定数
整数の定数値には、10進、16進、2進の3種の表記形態があります。
10進表記の整数値は、10進数字( 0〜9 )の並びになります。
    例: 174  65  8823
16進表記の整数値は、0x または 0X で始まり、16進数字の並びが続きます。
16進数字の 0〜9 は10進と同じで、それ以上は A〜F または a〜f になります。
    例: 0x4AF  0XCDDA38B4  0x123abc
2進表記の整数値は、0b または 0B で始まり、2進数字( 0, 1 )の並びが続きます。
    例: 0b10100111  0B00110001101

各表記で、桁位置を見やすくするために、任意の数字の間に ` を挿入できます。
    例: 12`345`678  0x123`4567`89AB  0b0101`010`11100`11`0111
なお、` は、整数定数表記の先頭または末尾には付加できません。

+ - の符号を、整数定数表記の前に付加できますが、文法的には演算子になります。
これは、ビットの反転演算子 ~ が、整数表記の前に付く場合と同様です。

整数値は、内部的には 32-bit の2の補数表現の整数データ型になります。
10進表記で可能な整数値の範囲は、- 符号も使えば、
    -2147483647 〜 2147483647
になりますす。この範囲を越えた10進表記定数は、浮動小数点数として扱われます。
この場合、警告のメッセージが表示されます。
16進表記で可能な整数値の範囲は、
    0x0 〜 0xFFFF`FFFF
です。この範囲を越えた16進表記は、文法エラーになります。
2進表記で可能な整数値の範囲は、
    0b0 〜 0b1111`1111`1111`1111`1111`1111`1111`1111
です。この範囲を越えた2進表記は、文法エラーになります。

10進表記と16進表記の対応を、以下に示します
     0 〜 +2147483647 は、0x0 〜 0x7FFF`FFFF に、
    -1 〜 -2147483647 は、0xFFFF`FFFF 〜 0x8000`0001 に、
対応します。なお、-2147483648 は、0x8000`0000 になりますが、10進表記では、
上記の通り、浮動小数点数として扱われます。整数型の定値として、どうしても、
 -2147483648 を表わしたい場合は、16進表記の 0x80000000 を使うことになります。

整数のデータ型に関しては、「基本データ型」の章で説明します。

●浮動小数点定数
浮動小数点数の定数値の書式には、小数点数値部だけの場合と、その後に指数部が続く
場合があります。
いずれの場合も、10進表記です。16進や2進での浮動小数点数の表記はありません。
小数点数値部は、小数点を途中に1つだけ含む10進数字( 0〜9 )の並びになります。
小数点は先頭以外ならどこにあっても構いません。
    例: 12.34   0.567

+ - の符号が、小数点数値部の前に付加できますが、文法的には演算子として扱います。
指数部は、E または e で始まり、次に符号があり、以降10進数字の並びが続きます。
符号は + か - で、省略も可能です。省略した場合、+ と同じ意味になります。
    例: 1.23e4   5.67E-12
指数部は、10 の累乗を表わします。上例では、それぞれ、以下の値になります。
        1.23×104  5.67×10-12

浮動小数点定数でも、桁位置確認用に、任意の数字の間に ` を挿入できます。
    例: 3.141`592`653  1.234`567`890E+12
なお、` は、浮動小数点定数表記の先頭または末尾には付加できません。

浮動小数点数値は、内部的には、IEEE754規格(倍精度)の 64-bit データです。
この有効桁数は10進で 15〜16 桁で、数値の範囲は概ね以下の通りです。
    2.2250738585072014E-308 〜 1.7976931348623158E+308

浮動小数点数のデータ型に関しては、「基本データ型」の章で説明しています。

●文字定数
文字定数は、文字コードの値を表す整数値で、対象の文字を ` と ` で囲んで表記します。
    例:  `A`   `あ`   `ア`   `亜`   `ア`
C言語では、文字定数は ' で囲みますが、本言語では ' は別の用途があるので、` で
囲みます。

文字定数は、通常の整数と同様、内部的には 32-bit の2の補数表現の整数になります。
文字定数は、あくまで定整数であって、文字列型のデータではありません。

通常、` と ` で囲む文字は1字だけですが、文字コードの合計が 4-byte (32-bit) を
越えない範囲で、2字以上も可能です。
    例:  `AB`   `XYZ`   `あい`   `アイウ`   `春秋`

文字定数と等価の整数値の例を、以下に示します。
    `A`     0x00000041
    `ABC`   0x00414243
    `あ`    0x000082A0
    `あい`  0x82A082A2

文字定数の内部の整数値は、通常あまり意識する必要はないかもしれませんが、
用途によっては以下の事項に配慮しておく必要があります。
まず、内部の整数値は2の補数表現なので、最上位ビットが1の場合、負の値になります。
たとえば、上例の文字定数 `あい` は負の値になります。
次に、バイトの並び順ですが、文字定数のバイト順は、文字列のバイト順とは異なります。
たとえば、上例の文字定数 `ABC` のバイト列は、0x43 0x42 0x41 0x00 になりますが、
文字列 "ABC" のバイト列は、0x41 0x42 0x43 0x00 となります。
なお、上記の文字定数のバイト列は、リトルエンディアン型を前提にしたもので、
ビッグエンディアン型の場合は、逆順になります。

文字定数の ` と ` の囲みの中には、「エスケープ文字」が記述できます。
エスケープ文字は、制御コードや特別の文字等を表記する場合に使用します。
エスケープ文字に関しては、「文字列リテラル」の章で詳しく説明しています。

●定文字列
定文字列は、文字列型の一定のデータを表します。
定文字列の表記形態(リテラル)には、以下の3種類があります。
    ・通常文字列
    ・純粋文字列
    ・直記文字列

定文字列に関しては、「文字列リテラル」の章で詳しく説明しますので、ここでは、
概要だけを述べます。また、文字列のデータ型に関しては、「基本データ型」の章で
説明しています。

通常文字列は、対象の文字列を2重引用符( " )で囲って表します。その囲い中では、
エスケープ文字が使えます。本言語の通常文字列は、C言語の定文字列の表記形態と
ほとんど同じです。

純粋文字列は、$ の直後に、対象の文字列を2重引用符(")、または、その代替文字で
囲って表します。その囲い中では、エスケープ機能はありません。そのため、\ は、
\\ としなくても、\ 自身を表わします。それ以外は、通常文字列と同じです。

直記文字列は、## または、その代替文字列で、対象の文字列を囲って表します。この
囲いの中には、改行やタブのような特殊なコードでも、エスケープ表記なしに、直接
入れることができます。また、この中には、式、マクロ、専用のコメントを埋め込む
ことができます。

●null
null は、無効値を示す特種な予約語で、数値でもマクロでもありません。
null のデータ型は、null型で、他のどのデータ型でもありません。
null に関しては、「基本データ型」の章で説明しています。

●演算子
演算子は、式に対して作用します。式に演算子を作用させるとそれに対応する値が求ま
ります。本言語で使用する演算子の一覧を以下に示します。

        ::  .  ^  $  @
        ::  .
        ()  []
        +  -  :
        '
        !  ~   ++   --
        *   /   %
        +   -
        <<   >>
        &
        ^
        |
        <   <=   >   >=
        ==   !=
        &&
        ||
        ? :
        =  :=  <-  +=  -=  *=  /=  %=  &=  |=  ^=  <<=  >>=  :==

この一覧では、上行ほど優先度が高く、同行内は同じ優先度になっています。
また、同じ演算子が2箇所にあるのは、単項と二項の違いによります。
演算子に関しては、「演算子」の章で詳しく説明しています。

●予約語
予約語は、あらかじめ用途が決められている単語です。
予約語は、役割上、キーワードと呼ばれることもあります。
本言語で使用する予約語の一覧を以下に示します。

    back        break       call        case
    class       continue    default     delete
    do          else        for         function
    goto        if          null        operator
    print       quit        return      scope
    switch      this        warp        while
    with

これらの予約語は、一般の識別名には使用できません。
各予約語については、関連各章で個別に説明します。

●その他の字句要素
 以上述べた以外にも、各種の字句要素があります。以下に主なものを挙げます。
    ・文の終端を示すセミコロン        文 ;
    ・式を区切るコンマ                式 , 式
    ・式のまとまり等を示す丸括弧      ( 式 )
    ・連想配列要素等を示す角括弧      [ 式 ]
    ・文のブロック等を示す波括弧      { 文の並び }
    ・ラベル設定用のコロン            ラベル名 :