MikoScript3 言語仕様
構文構成
●プログラム
「プログラム」は、テキストファイルに記述します。プログラムが記述されたテキスト
ファイルを「ソースファイル」と言います。ソースファイル内のプログラムを、「ソース
プログラム」と言います。ソースプログラムを解釈して実行するのが、「インタプリタ」
です。
ソースプログラムは、「構文」で構成されます。構文には、「実行文」と「関数定義」
があります。関数定義内にも、実行文がありますが、それは、その関数がコールされない
限り、実行されません。インタプリタが、ソースプログラムを実行する際に、直接の実行
対象になるのは、関数定義の外にある実行文です。
例えば、以下のソースプログラムには、直接の実行対象になる関数定義外の実行文と、
直接の実行対象にはならない関数定義が、それぞれ1つずつあります。
print "これは関数定義外の実行文です";
function F() // 関数定義
{
print "これは関数定義内の実行文です";
}
このプログラムを実行すると、「これは関数定義外の実行文です」がプリントされますが、
関数定義は実行されないので、「これは関数定義内の実行文です」はプリントされません。
一方、次のソースプログラムでは、直接の実行対象になる関数定義外の実行文で、定義
関数をコールしてしています。
F(); // 関数コール
print "これは関数定義外の実行文です";
function F() // 関数定義
{
print "これは関数定義内の実行文です";
}
この場合、関数コールよって関数が実行されるので、「これは関数定義内の実行文です」
と「これは関数定義外の実行文です」の両方がプリントされます。
なお、この例でも分かるように、本言語では、関数コールよりも後の行で、関数定義が
記述されていても、特に問題ありません。
このように、本言語のソースプログラムには、C 言語ような main 関数はありません。
その代わりに、ソースプログラム全体が、言わば「暗黙のメイン関数」になっています。
インタプリタは、ソースプログラムを実行する際、この暗黙のメイン関数を最初にコール
します。但し、ソースプログラムに「初期設定関数」が定義されていれば、それを先に
実行します。この詳細は「モジュール」の章で説明しています。
ソースプログラムが、関数定義だけで直接の実行文がない場合、インタプリタでそれを
実行しても、そのプログラムのどの部分も、実質的な実行対象にはなりません。例えば、
function F1() { print "This is F1."; }
function F2() { print "This is F2."; }
のようなソースプログラムを、インタプリタで実行しても、翻訳は行なわれますが、実質
的には、プログラムのどの部分も実行されません。関数定義だけのソースプログラムは、
通常、ライブラリー用のプログラムになります。
但し、暗黙のメイン関数内の直接の実行文は、共通のサブルーチンとして、「call 文」
から呼び出せるので、ライブラリー用のソースプログラムに、直接の実行文がある場合も
あります。このサブルーチンコールについては、「制御の流れ(ジャンプ系)」の章内の
「call 文と back 文」の節で述べます。
●実行文
「実行文」は、単に「文」とも言います。
本言語の「実行文」には、以下の種類があります。
種別名 | 書式 |
式文 | 式*; |
ブロック文 | { 文の並び } |
if 文 | if( 式 ) 文 else 文 |
switch 文 | switch( 式 ) 文 |
while 文 | while( 式 ) 文 |
for 文 | for( 式* ; 式* ; 式* ) 文 |
do-while 文 | do 文 while( 式 ); |
continue 文 | continue; |
break 文 | break; |
quit 文 | quit; |
goto 文 | goto ラベル; |
warp 文 | warp ラベル; |
call 文 | call ラベル; |
back 文 | back; |
return 文 | return 式; |
scope 文 | scope 箱名 { 文の並び } |
構造体設定文 | 構造体名 ::= { 文の並び } |
class 文 | class クラス名 : 基底 { クラス記述 } |
delete 文 | delete 箱名の並び; |
print 文 | print 項目の並び; |
コマンド文 | 関数名~ 引数の並び; |
配列初期設定文 | 配列 = { 初期値の並び }; |
空文 | ; |
(注意)表内の書式はあくまで参考で、関係各所で厳密に記します。
式* は、「リスト式」にもできます。(詳細後述)
実行文には、「ラベル」を付けることができます。
実行文は、「式」ではないので、実行文の値というものはありません。
上記の各実行文のうち、「ブロック文」については、以下で説明します。
それ以外は、関係各所で詳述しています。
●ブロック文
「ブロック文」は、一連の実行文を、波括弧 { と } で囲ったもので、実行文のまとま
りを表わします。そのため、ブロック文を、「複文」と言うこともあります。ブロック文
自身もまた、実行文なので、ブロック文の波括弧の囲いの中に、別のブロック文を入れる
ことができます。つまり、ブロック文は入れ子にすることができます。また、特殊なケー
スとして、実行文を全く含まない空の波括弧の囲いも、ブロック文になります。多くの実
行文の末尾は、セミコロン ; になりますが、ブロック文の末尾には、セミコロン ; が付
きません。
●式
「式」には、単一の字句要素から成る「単項式」と、複数の字句要素から成る「複合式」
があります。
式には「値」があります。式の値を求めることを「式を評価する」と言います。
「単項式」には、以下の種類があります。これらの表記に関しては、「字句要素」の章
で詳述しています。また、意味は、「基本データ型」の章等の関連各所で詳述しています。
・整数定数
・実数定数
・文字定数
・定文字列
・null
・this
・箱名(識別名)
「複合式」には、いろいろありますが、機能的に分類すると、以下のようになります。
これらは、関連各所で詳述しています。
・箱の経路(連想配列要素も含む)
・演算式(算術/論理演算等)
・関数コール
・インスタンス生成
・純粋配列要素
・匿名関数定義
・その他
●リスト式
「文」のなかで使われる「式」には、複数の式をコンマで区切った「リスト式」にでき
る場合もあります。上記の実行文の種類の表内の「式*」がその場合です。
リスト式は、たとえば、以下のような書き方になります。
A = 1, X++, B = 2 * F( i, j )
リスト式の評価は、必ず、左から右の順に行なわれます。たとえば、
式1, 式2, 式3
の場合、まず、式1が評価され、次に、式2が評価され、最後に、式3が評価されます。
リスト式全体の評価値としては、最後の式の評価値で代表されます。たとえば、上例の
リスト式の評価値は、式3の評価値になります。
リスト式を「多重代入」や「return 文」で使う場合、丸括弧で囲う必要があります。
リスト式は、現状、この用途か、前述の「式*」の場合以外は、使えません。
●関数定義
本言語の「関数定義」には、以下の2種類があります。
・通常の関数定義
・演算子の多重定義
関数定義内の実行文は、前述の通り、その関数がコールされた時に、実行されます。
関数定義自体は、実行文とは違って、ラベルを付けることはできません。
関数定義は、式ではないので、関数定義の値というものはありませんが、関数コールに
よって、その関数が返す値を取得することができます。
関数定義は、入れ子にすることはできません。つまり、関数定義の中で、別の関数定義
を入れることはできません。但し、「匿名関数」や「do-with 式」内の「ブロック関数」
の定義を入れることはできます。
通常の関数定義は「関数」の章で、演算子の多重定義は「演算子の多重定義」の章で、
それぞれ、詳説しています。