オートマトンの連接
オートマトンを連接するとき、2種類の連接がある。
- JSONの配列やオブジェクトを表すオートマトンでは、終状態から出るエンドマーカー(終端記号)の辺をそのまま残す。
- 正規表現を部分式から構成するときは、終状態から出るエンドマーカー(終端記号)の辺は全部削除して、終状態と次の開始状態を張り合わせる。
2番目のやり方の問題は、逆流が生じるかも知れないことだ。MとNがオートマトンとして、連接オートマトン内でNの(旧)始状態から、もう通り過ぎたはずのMの内部状態に戻ることができてしまう。これを防ぐには、逆流止めにイプシロン辺を入れるが、イプシロン辺はまた別な問題を引き起こす。イプシロン辺とは別なブリッジ辺/ワープ辺を設けるか。
イプシロン記号じゃなくてワープ記号というのを入れて、ワープ記号も含めて決定性ならいいのか。ニードル(カレント状態ポインタ)は、入力記号を保持した状態(=インスタンス側のニードルを動かさないで)ワープ辺を必要なだけたどれる。
つまり、(何種類かの)終端記号と1つのワープ記号を準備すればいいのだな。これらの特殊記号もディスパッチラベルとして使えばいいのだ。ディスパッチラベルは:
- 型名 integer, boolean, ...
- タグ名 @foo, @*
- プロパティ名 "foo": *:
- スカラーリテラル 1, "hello" など
- 終端記号、'}', ']', '$'
- ワープ記号 #warp
このなかでユニオン弁別子に使えるのは: