仕様


予約語
char int float double short long void
unsigned signed const volatile
static extern auto register
if else while do for
switch case default
break continue goto
return
struct union enum typedef
追加予約語
print
flow init final kill
wait event alway next
予約変数
$flow_id $last_flow_id $event_no
$event_param1 $event_param2
プリプロセス用予約語
#include #define #undef #if #elif #else #endif
#ifdef #ifndef
#error #line #pragma
defined 
__FILE__ __LINE__ __DATE__ __TIME__

演算子
+ - * / % & | ^ && || ! ~ << >> < > -> . ( ) [] ,
? :
sizeof
= += -= *= /= %= $= |= ^= != == >= <= <<= >>=
数値表現(C言語に準拠?)
整数、実数、16進数整数、8進整数
文字列
"ABC"
文字
'a'

C言語の文法で未実装なもの
  • const,register,auto,volatile
C言語としての意味が無視されます。
  • double
現時点ではfloatとして処理されます。
  • ビットフィールド
実装未定
  • 構造体、共用体自体をパラメータや戻り値としては扱えません
ポインタでやり取りしてください。

C言語の文法で解釈が異なるもの
  • static
概ねC言語と同じですが、内部ブロック{}からアクセスできるように
静的領域にメモリが確保されます。
  • extern
C言語側で実装している関数および変数を宣言するときに使用します。

ここでのサンプルはmain関数のないC言語みたいなものです。
  • サンプル1 変数に値を代入して標準出力に出してみる
int i;
i = 1;
print i;
  • サンプル2 配列に値を代入して表示してみる
int i, j;
float fa[2][2];
for(i = 0; i < 2; i++)
  for(j = 0; j < j; j++)
    fa[i][j] = i*2+j;
for(i = 0; i < 2; i++)
  for(j = 0; j < j; j++)
    print fa[i][j];
  • サンプル3 関数を定義して使ってみる
 int func(int i, int j)
 {
     return i*j;
 }
 print func(1, 2);
  • サンプル4 さらに構造体
 typedef struct X {
   int i;
   float f;
 } X;
 X x = {1, 2.0f};
 // 1行に出力する場合の書式
 print "x.i=" print x.i print " x.f=" print x.f;


擬似スレッド
flow statement;
flow { statements }
  • サンプル
 print "1";
 thread {
   print "4" ;
   init {
     print "2";
   }
   print "5" ;
   final {
     print "9";
   }
   print "6";
   delay(1);
   print "8";
 }
 print "3" ;
 delay(1);
 print "7";
 delay(1);
 print "10";

初期化処理
init statement;
init { statements }
flowを生成した時に実行する文
flow {
  int i;
  init {
   i = 0;
  }
}
flow内変数などの初期化処理として使用します。
flow内処理は通常生成時点での他のスレッドの最後で処理されますので、
生成時に初期化しておきたい処理などを記述します。
ただし、init 文内では遅延命令(delay, wait等)は使えません。
??? (注)記述的にはinit文の初期化後に初期化文が実行される?
 int i = 1;
 init {
   i = 0;
 }
 if(i == 1)
   pintr "i == 1";    // こちらが処理される
 else
   pintr "i == 0";

最終処理
final statement;
final { statements }
flow文が最後に実行する文
flow {
  void* p = NULL;
  // :
  final {
   if(p)
     free(p); // メモリ開放命令など
  }
}
flowが外部要因で終了するときなどに後始末したい処理を記述する。

flowの強制終了
kill
kill flow_id;
 int i = 0;
 int iThd;
 flow {
   for(i = 0; i < 10; i++)
   {
     print i;
     delay 1;
   }
   final print "final";
 }
 iThd = $last_thread_id;
 wait(i == 5);
 kill iThd;


遅延処理(時間指定)
delay
delay exp;
遅延処理を時間(整数型)で指定する。
 flow {
   print 1;
   delay 1;
   print 3;
 }
 flow {
   print 2;
   delay 1;
   print 4;
 }
 delay (1+1);
 print 5;
遅延時間0を指定すると遅延なしに次の文が実行される。

遅延処理(条件指定)
wait
wait condition;
遅延処理を条件が成立するまで行う。
 int i;
 flow {
   wait(i == 5);
   print i;
   wait(i == 8);
   print i;
 }
 for(i = 0; i < 10; i++)
   delay 1;
条件が偽ならば時間1遅延処理を行う
while(!condition) delay 1; // と等価

イベント処理(一度のみ)
once (event_no) statement;
実行後event_noが発行されたら1度だけ処理を行います。


イベント処理(複数回)
always (event_no) statement;
実行後event_noが発行される度に処理を行います。


イベント発行処理
event event_no
event_noを発行します。


最終更新:2009年10月26日 01:28