home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
POLYEDIT.LZH
/
ML
/
ML.DOC
< prev
next >
Wrap
Text File
|
1994-08-05
|
10KB
|
247 lines
****************************************************************************
*
* マクロ言語
*
* Copyright T.Kobayashi 1994.8.5
*
****************************************************************************
1.はじめに
'ml'はインタープリンタ形式で実行するマクロ言語である。モデラ( model.exe,
model.x )のユーザインターフェースの記述に用いられている。
2.予約語と定数
予約語は以下の通り。
if, else, while, do, for, break, continue, return, var,
function, private
定義済み定数(システム定数)は以下の通り。
TRUE 真
FALSE 偽
ON ON
OFF OFF
NOASSIGN 値が代入されていない変数
BOOLEAN 論理型
INT 整数型
REAL 実数型
ARRAY 配列型
FUNC 関数への参照型
TYPE 「型を示す」型
OBJECT オブジェクト型
3.文法定義
文法の定義に用いる記号を示す。
::= 左辺は右辺で定義される
( ... )+ カッコ内の1回以上の繰り返し
( ... )* カッコ内の0回以上の繰り返し
[ ... ] カッコ内は省略可能
" ... " クオートで囲まれた文字列そのもの
< ... > 文法上の概念
| 左右のいずれか
以下に言語の文法定義を示す。
<プログラム> ::= ( <文> )*
<文> ::= <宣言> | <実行文> | <複文>
<複文> ::= "{" <文>* "}"
<宣言> ::= <変数宣言> | <関数宣言>
<変数宣言> ::= var <変数> ( , <変数> )* ;
<関数宣言> ::= function <識別子> "(" [ <変数列> ] ")" <文>
<変数列> ::= <変数> ( , <変数> )*
<変数> ::= <識別子> ( "[" <式> "]" )*
<実行文> ::= <if文> | <while文> | <do文> | <for文>
<break文> | <continue文> | <return文> |
<代入文> | <インクリメント文> | <手続き文>
<if文> ::= if "(" <式> ")" <文> [ else <文> ]
<while文> ::= while "(" <式> ")" <文>
<do文> ::= do <文> while "(" <式> ")" ;
<for文> ::= for "(" <文> <式> ; <文> ")" <文>
<break文> ::= break ;
<continue文> ::= continue ;
<return文> ::= return [ <式> ] ;
<代入文> ::= <変数> 代入演算子> <式> ;
<代入演算子> ::= = | += | ー= | *= | /= | &= | "|="
<インクリメント文> ::= <変数> <インクリメント演算子> ;
<インクリメント演算子> ::= ++ | --
<手続き文> ::= <識別子> "(" [ <引数列> ] ")" ;
<引数列> ::= <式> ( , <式> )*
<式> ::= <論理積式> ( <論理和演算子> <論理積式> )*
<論理積式> ::= <比較式> ( <論理積演算子> <比較式> )*
<比較式> ::= <単純式> ( <比較演算子> <単純式> )*
<単純式> ::= <積和式> ( <シフト演算子> <積和式> )*
<積和式> ::= <項> ( <加法演算子> <項> )*
<項> ::= <因子> ( <乗法演算子> <因子> )*
<因子> ::= <単純因子> ( <参照演算子> <単純因子> )*
<単純因子> ::= [ <単項演算子> ]
( <変数> | <定数> | <関数> | "(" <式> ")" )
<関数> ::= <識別子> "(" [ <引数列> ] ")"
<定数> ::= <数値定数> | <文字列定数> | <システム定数>
<論理和演算子> ::= "|"
<論理積演算子> ::= &
<比較演算子> ::= == | != | < | > | <= | >=
<シフト演算子> ::= "<<" | ">>"
<加法演算子> ::= + | -
<乗法演算子> ::= * | / | %
<参照演算子> ::= . | "->"
(注意)
<識別子>はアルファベットまたは数字または'_'の文字を組み合わせた文字列
(ただし、最初の文字は数字以外)である。
<数値定数>は0~9と'.'を組み合わせた文字列またはシングルクオートで囲ま
れた文字(その文字のアスキーコードを示す)。
<文字列定数>はダブルクオート'"'で囲まれた文字列である。
<システム定数>は前節で定義した。
<手続き文>と<関数>で参照されている<識別子>は<関数宣言>で宣言した<識別
子>でなければならない。
<単純因子>と<代入文>、<インクリメント>文で参照されている<識別子>は<変
数定義>で宣言した<識別子>でなければならない。
4.意味定義
プログラム
<プログラム>は複数の<文>から構成される。<プログラム>を複数のファイルに分
割しても良いが、分割は<文>単位でされなければならない。
実行はファイルの先頭からなされる。分割した場合は別途ファイルの実行順を指
定する手段が用意される(はずである)。
文
<文>はフリーフォーマットである。改行はスペース文字と同様の意味しか持たな
い。Cと同様に{}で囲まれた1個以上の文は1個の文と同じものとみなされる(複
文)。
宣言文
<宣言文>は実行されない。
関数宣言
<関数宣言>中の文も宣言時には実行されない。他の<文>から参照された時に実行さ
れる。宣言は参照の前になされなければならない。<関数宣言>中で<関数宣言>する
ことはできない。従って、手続きと関数は常に大域である。
変数宣言
トップレベルで宣言された<変数>は大域変数となる。<関数宣言>の中で宣言された
<変数>はローカル変数となる。<変数宣言>は必ずしも<関数宣言>の先頭でする必要
はないが、使用する前には宣言しなければならない。同様に大域変数もファイルの
先頭で宣言する必要はないが、使用する前に宣言しなければならない。
変数と型
変数には型はない。数値には型がある。従って数値はその値と型を持ち、変数は型
と値の両方を保持する。型は以下の通り。
BOOLEAN 論理型
INT 整数型
REAL 実数型
ARRAY 配列型
FUNC 関数への参照型
TYPE 「型を示す」型
OBJECT オブジェクト型
組み込み関数typeofで数値からその型を得ることができる。
BOOLEANは論理演算と一致、不一致比較( ==, != )のみ演算可能。INTは参照演算を
除くすべての演算が可能。REALは論理演算、シフト演算、参照演算以外のすべての
演算が可能。ARRAY, FUNC, TYPEは一致、不一致比較のみ演算可能。
一度も代入されてない変数を参照してはならない。
OBJECTは拡張型であり、拡張された型をクラスと呼ぶ。
クラスは応用システムごとに定義される(行列型、ベクトル型、複素型等)。文字
列型はデフォルトで定義されている。クラスごとに演算子の動作を定義できる。
配列変数
配列変数はCと同様に[]を用いる。多次元配列も使用可能。
変数に型はないので配列変数の各メンバに別々の型の数値を代入してもよい。
1次元の配列変数を識別子だけで参照するとARRAY型とみなされる。同様に2次元の
配列変数を識別子だけまたは1次元配列として参照してもARRAYとみなされる。
制御文
if, while, fo, for, break, continue, returnの動作はCと同様である。
演算
演算は単項演算、乗法演算、加法演算、比較演算、論理演算の順に優先される。
同一演算の中では左から右に演算される。Cと違って論理積と論理和の優先順位
は同じである。
5.組み込み手続きと組み込み関数
procedure print( ... )
----------------------------------------------------------------------------
引数を表示して、改行する。
引数はBOOLEAN, INT, REAL, STRINGが有効。
[例] print( "hello ", "world" );
----------------------------------------------------------------------------
procedure printf( fmt, ... );
----------------------------------------------------------------------------
フォーマットを設定して表示する。
Cと同様。
----------------------------------------------------------------------------
procedure callprocedure( proc, ... )
----------------------------------------------------------------------------
手続きを呼び出す。
procはPROC型でなければならない。2番目以降の引数にprocへの引数を設定する。
[例] callprocedure( print, "hello ", "world" );
----------------------------------------------------------------------------
function typeof( arg )
----------------------------------------------------------------------------
argの型を返す。argはすべての型で有効。
戻り値はTYPE型。
----------------------------------------------------------------------------
function sizeof( ary )
----------------------------------------------------------------------------
配列のサイズを返す。aryは配列型。
戻り値はINT型。
----------------------------------------------------------------------------
function strcat( str1, str2, ... )
----------------------------------------------------------------------------
引数の文字列を連結する。引数の数は可変ですべて文字列型。
戻り値はSTRING型。
----------------------------------------------------------------------------
function tostring( arg )
----------------------------------------------------------------------------
argを文字列に変換する。argはBOOLEAN, INT, REAL型のいずれか。
戻り値はSTRING型。
[例] str = tostring( 1.0 ); strに"1.0"が代入される。
----------------------------------------------------------------------------
function stringto( str )
----------------------------------------------------------------------------
strをBOOLEAN, INT, REAL型のいずれかに変換する。strはSTRING型。
いずれの型にも変換できなかった場合はstrそのものを返す。
戻り値はBOOLEAN, INT, REAL, STRING型。
[例] a = tostring( "123" ); aに123が代入される。
----------------------------------------------------------------------------
function strlen( str )
----------------------------------------------------------------------------
strの長さを得る。strはSTRING型。
戻り値はINT型。
----------------------------------------------------------------------------
function substr( str, top, len )
----------------------------------------------------------------------------
文字列strのtop文字目からlen文字の長さの文字列を得る。
strはSTRING型、top, lenはINT型。
戻り値はSTRING型。
----------------------------------------------------------------------------
function sqrt( arg )
function sin( arg )
function cos( arg )
function tan( arg )
function log( arg )
function exp( arg )
----------------------------------------------------------------------------
数値関数、引数はREAL型で戻り値もREAL型
----------------------------------------------------------------------------
function abs( arg )
----------------------------------------------------------------------------
引数argの絶対値を求める。argはINTまたはREAL型。
戻り値はargと同じ型。
----------------------------------------------------------------------------
function callfunction( func, ... )
----------------------------------------------------------------------------
関数を呼び出す。
funcはFUNC型でなければならない。2番目以降の引数にfuncへの引数を設定する。
[例] a = callfunction( tostring, "123" ); aに123が代入される。
----------------------------------------------------------------------------