map1	state1
	state1
		entry						{map1_state1_entry}
		exit						{map1_state1_exit}
		suspend						{map1_state1_suspend}
		resume						{map1_state1_resume}
		trans1										state2			#//┐
		trans2						{map1_state1_trans2_act}				#//│
		trans3						{map1_state1_trans3_act}	state2			#//│
		trans4		[map1_state1_trans4_guard]					state2			#//│guardは任意に省略可｡actとstateは少なくとも一方を指定する必要が有る｡
		trans5		[map1_state1_trans5_guard]	{map1_state1_trans5_act}				#//│
		trans6		[map1_state1_trans6_guard]	{map1_state1_trans6_act}	state2			#//│
		default		[map1_state1_default_guard]	{map1_state1_default_act}	state2			#//┘"default"は予約語ではない｡ｽｷｬﾅではなくﾊﾟｰｻにて処理する｡ﾕｰｻﾞｰ定義の遷移名との違いは､遷移番号(0)を割り当てる事だけである｡
	end
	state2
		entry						{}							#//┐
		exit						{}							#//│
		suspend						{}							#//│
		resume						{}							#//│
		trans1										state1			#//│
		trans2						{}							#//├括弧だけを書いてGuard名,Act名を省略すると､自動的に名前を作成する｡生成する名前の規則は､上の例を参照せよ｡名前を省略しない場合は､規則に従う必要は無い｡
		trans3						{}				state1			#//│
		trans4		[]								state1			#//│
		trans5		[]				{}							#//│
		trans6		[]				{}				state1			#//│
		default		[]				{}				state1			#//┘
	end
end
map2	state1
	state1														#//┐
		entry						{}							#//├entry,exit,suspend,resume,trans,defaultの全てが必要な訳では無い｡何か一行だけでも定義すれば良い｡空の状態は定義出来ない｡
	end														#//┘
	state2														#//┐
		trans1		[]				{}				state1			#//├同上｡
	end														#//┘
	entry							{map2_entry}						#//┐
	exit							{map2_exit}						#//│
	suspend							{map2_suspend}						#//├現在の状態にentry,exit,suspend,resume,trans,defaultが無い場合のﾃﾞﾌｫﾙﾄ処理を､状態ﾏｯﾌﾟに登録する事が出来る｡必須ではない｡
	resume							{map2_resume}						#//│
	trans1			[map2_trans1_guard]		{map2_trans1_act}		state2			#//│
	default			[map2_default_guard]		{map2_default_act}		state1			#//┘
end
map3	state1
	state1
		trans1		[]				{}				     state1		#//FsmObj_SetState() に相当する｡
		trans2		[]				{}				push(state1)		#//FsmObj_PushState()に相当する｡
		trans3		[]				{}				pop			#//FsmObj_PopState() に相当する｡
	end
end
map4	state1
	state1
		trans1		[]				{}				state1			#//┐
		trans2		state1				[]				{}			#//│
		trans3		{}				state1				[]			#//├[ｶﾞｰﾄﾞ条件]と{ｱｸｼｮﾝ}と遷移先状態は､任意の順序で記述出来る｡どの順序で記述しても､生成されるﾃﾞｰﾀに違いは無い｡
		trans4		[]				state1				{}			#//│
		trans5		{}				[]				state1			#//│
		trans6		state1				{}				[]			#//┘
	end
end
#// * Mon Jun 29 21:48:11 JST 2015 Naoyuki Sawa
#// - 遷移の名前が同じで、ガード条件が異なる、遷移セットを定義出来るようにしました。
#//   優先順位は、「SMC - The State Machine Compiler」(http://smc.sourceforge.net/)を参考にさせて頂きました。
#//     1-1-1. 現在の状態の、指定された遷移の、ガードが有る遷移で、ガード条件が成立した遷移	複数有る場合は順不同。現在の実装ではガード名の順としているが、その挙動に依存してはいけない。
#//     1-1-2. 現在の状態の、指定された遷移の、ガードが無い遷移
#//     1-2-1. 状態マップの、指定された遷移の、ガードが有る遷移で、ガード条件が成立した遷移	複数有る場合は順不同。現在の実装ではガード名の順としているが、その挙動に依存してはいけない。
#//     1-2-2. 状態マップの、指定された遷移の、ガードが無い遷移
#//     2-1-1. 現在の状態の、デフォルト遷移の、ガードが有る遷移で、ガード条件が成立した遷移	複数有る場合は順不同。現在の実装ではガード名の順としているが、その挙動に依存してはいけない。
#//     2-1-2. 現在の状態の、デフォルト遷移の、ガードが無い遷移
#//     2-2-1. 状態マップの、デフォルト遷移の、ガードが有る遷移で、ガード条件が成立した遷移	複数有る場合は順不同。現在の実装ではガード名の順としているが、その挙動に依存してはいけない。
#//     2-2-2. 状態マップの、デフォルト遷移の、ガードが無い遷移
#//   上記の順に検索して、実行できる遷移がなかった場合は、エラー停止します。
#//   詳細は、/clip/clipfsm.cのFsmObj_ApplyTrans()の実装を参照してください。
map5	state1
	default							{}				state1			#//─2-2-2.
	default			[guard1]			{}				state1			#//┬2-2-1.
	default			[guard2]			{}				state1			#//┘
	trans1							{}				state1			#//─1-2-2.
	trans1			[guard1]			{}				state1			#//┬1-2-1.
	trans1			[guard2]			{}				state1			#//┘
	state1
		default						{}				state1			#//─2-1-2.
		default		[guard1]			{}				state1			#//┬2-1-1.
		default		[guard2]			{}				state1			#//┘
		trans1						{}				state1			#//─1-1-2.
		trans1		[guard1]			{}				state1			#//┬1-1-1.
		trans1		[guard2]			{}				state1			#//┘
	end
end
#// * Wed Jul 01 21:26:23 JST 2015 Naoyuki Sawa
#// - スクリプト内で、関数のコード指定を出来るようにしました。
#//   処理内容が短い場合は、下記の例のように、関数のコード指定で書く方が簡潔です。
#//   処理内容が複雑な場合は、これまでどおり名前指定にして、関数定義はアプリケーション内で行う方が、保守の観点から望ましいです。
#// - 関数のコード指定内での改行は、当ツール自体は対応していません。
#//   先にCプリプロセッサを通せば、行末のバックスラッシュによる行継続は可能です。
map6	state1
	state1
		entry						{`myEntry()`}
		exit						{`myExit()`}
		suspend						{`mySuspend()`}
		resume						{`myResume()`}
		trans1		[`mode == 1`]			{`mode = 2`}			state2
	end
	state2
		entry						{`myEntry()`}
		exit						{`myExit()`}
		suspend						{`mySuspend()`}
		resume						{`myResume()`}
		trans1		[`mode == 2`]			{`mode = 3`}			state1
	end
end
#// * Wed Jul 01 21:52:52 JST 2015 Naoyuki Sawa
#// - 行末のバックスラッシュで行継続する機能を追加しました。
#//   有限状態機械マップスクリプトはCプリプロセッサと相性が悪く、当ツールにかける前にCプリプロセッサを通してCプリプロセッサによる行継続を適用する事が難しい事が判ったからです。
#//   有限状態機械マップスクリプト内の'%{〜%}'の中でCプリプロセッサ疑似命令を使用していると、Cソースファイルに出力する前に展開されてしまい、予期しない結果になるからです。
#//   上記の問題を避けるため、当ツール自体に、行末のバックスラッシュで行継続する機能を追加する事にしました。
#// - '%{〜%}','[`〜`]','{`〜`}'の中は、字句解析によって行継続しますので、行末のバックスラッシュ指定は不要です。
map7	state1
	state1
		trans1				\
			[`(mode == 1)`]		\
			{`
				myProc1();
				myProc2();
			`}			\
			state1
	end
end
#// * Wed Jul 29 09:09:12 JST 2015 Naoyuki Sawa
#// - これまで、[`…`],{`…`}の中に、特定のシフトJIS文字が含まれていると、コンパイルエラーになる不具合がありました。
#//   具体的には、2バイト目がバッククォートの文字コード(\x60)の文字('〜','Ａ','形','伝'など)が含まれていた場合です。
#// - 本日、`…`の中ではシフトJISを意識したスキャンを行うように修正したので、上記の不具合は無くなりました。
#//   今後は、[`…`],{`…`}の中に、2バイト目がバッククォートの文字コード(\x60)の文字を含んでも、問題無く動作します。
#// - ただし、[`…`],{`…`}の中に、「`」そのものを含むと、これまでと同様にコンパイルエラーになるので注意して下さい。
map8	state1
	state1
		trans1				\
			[`strcmp("〜","Ａ")`]	\
			{`puts("形・伝")`}
	 #//ｴﾗｰ	trans2				\
	 #//ｴﾗｰ		[`strcmp("`","`")`]	\
	 #//ｴﾗｰ		{`puts("`")`}
	end
end
#// * Wed Jul 01 21:26:23 JST 2015 Naoyuki Sawa
#// - %{〜%}で、C言語ソース部分の出力の先頭に出力する、ソース文字列を指定出来るようにしました。
#//   スクリプト内のどこに記述しても、C言語ソース部分の出力の先頭に出力します。
#//   スクリプト内に複数回記述した場合、全て連結して、C言語ソース部分の出力の先頭に出力します。
%{
#include <stdio.h>
int mode, page;
%}
#// * Fri Mar 04 21:22:19 JST 2016 Naoyuki Sawa
#// - '-p'オプションを追加しました。
#// - 有限状態機械スクリプトの中に、プロパティテーブルスクリプトも書ける、書式を追加しました。
#//   アクターオブジェクトを定義する時に、状態マップと同名のプロパティテーブルを定義する事が多いので、有限状態機械スクリプトの中で両方をまとめて記述できると便利だからです。
#//   C++やJava等のオブジェクト指向言語と似た、書き方が出来るようになりました。
#//   ただし、有限状態機械スクリプトコンパイラは、プロパティテーブルスクリプトの内容を意識しません。
#//   @{〜@}で囲まれた範囲を、プロパティテーブルスクリプトと認識して、別のファイル(又は,標準出力の最後)にまとめて出力するだけであり、
#//   プロパティテーブルスクリプト自体のコンパイルやエラー検出は、別途、プロパティーテーブルスクリプトコンパイラを実行しておこなって下さい。
#// - 状態マップの外で@{〜@}で囲まれた範囲は、そのまま、任意のプロパティーテーブルスクリプトとして出力します。
#//   任意のtype定義や、任意のtable定義が可能です。
#// - 状態マップの中で@{〜@}で囲まれた範囲は、状態マップと同じ名前のプロパティーテーブルとして出力します。
#//   プロパティテーブル名(=状態マップ名)と、最後のendは、自動的に出力されます。
#//   @{〜@}の中には、プロパティテーブルのフィールド定義を書いて下さい。
#// - 状態マップの外の@{〜@}も、状態マップの中の@{〜@}も、一か所に纏めて書いても構いませんし、複数個所に分けて書いても構いません。
#//   複数個所に書いても、複数個所に書いた内容を連結して出力し、どちらでも同じ結果になります。
@{
Byte
	range	-128,127
end
@}
mapA	Init
	@{
		var1	:Byte	<"%8d">
		var2	:UByte	<"%8u">
	@}
	Init
		entry	{``}
	end
end
@{
UByte
	range	0,255
end
@}
mapB	Init
	@{
		var1	:Byte	"説明文1"
	@}
	Init
		entry	{``}
	end
	@{
		var2	:UByte	"説明文2"
	@}
end
#// * Fri Jan 06 23:24:43 JST 2017 Naoyuki Sawa
#// - clipfsm.cにて状態マップに初期化Act関数を定義出来るようにした事に伴い、dFsmMapC.exeも変更後のレジストリ構造を出力するように変更しました。
#//   状態マップに初期化Act関数を定義する場合は、下記の例のように初期状態の前に指定して下さい。関数定義の書式は、これまでのAct関数と同じです。
#//   状態マップに初期化Act関数を定義しない事も可能ですので、既存の有限状態機械スクリプトはそのままで構いません。
map9	{`ST_ActObj* const pActObj = ActObj_FromFsmObj(pFsmObj); \
	  ST_PrpHdr* const pPrpHdr = ActObj_GetPrpHdr( pActObj); \
	  PrpHdr_set_f(pPrpHdr, (intptr_t)pParam, "cnt");`} state1
	@{
		cnt	"カウンタ"
	@}
	state1
		trans1	{`printf("%d\n", cnt++)`}
	end
end
#// * Sun Jan 15 09:21:07 JST 2017 Naoyuki Sawa
#// - 自己遷移を抑止するGuard関数の省略記法を追加しました。
#//   詳細は、winapp.cのTrans_new()の、2017/01/15追加部分のコメントを参照して下さい。
mapC	state1
	trans1a	[no-self-transition]	{}	state3		#//ok	「trans1a [`FsmObj_GetState(pFsmObj) != FsmState_state3`] {} state3」と書くのと同じです。	┬現在の状態がstate1,又は,state2である時は実行され、現在の状態がstate3である時は抑止されます。
	trans1b	[no-self-transition]	{}	push(state3)	#//ok	「trans1b [`FsmObj_GetState(pFsmObj) != FsmState_state3`] {} push(state3)」と書くのと同じです。	┘別の方法としてstate1とstate2だけに遷移を定義すればGuard関数を使用しなくても同様の処理は実現出来るのですが、多くの状態に対して共通の遷移を定義する場合はこのようにマップに遷移を定義して自己遷移だけを抑止する方が簡潔になります。
    #//	trans1c	[no-self-transition]	{}	pop		#//NG
    #//	trans1d	[no-self-transition]	{}			#//NG
	state1
		entry	{`puts("state1")`}
	end
	state2
		entry	{`puts("state2")`}
	end
	state3
		entry	{`puts("state3")`}
	end
end
