このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

オートマトンの連接

オートマトンを連接するとき、2種類の連接がある。

  • JSONの配列やオブジェクトを表すオートマトンでは、終状態から出るエンドマーカー(終端記号)の辺をそのまま残す。
  • 正規表現を部分式から構成するときは、終状態から出るエンドマーカー(終端記号)の辺は全部削除して、終状態と次の開始状態を張り合わせる。

2番目のやり方の問題は、逆流が生じるかも知れないことだ。MとNがオートマトンとして、連接オートマトン内でNの(旧)始状態から、もう通り過ぎたはずのMの内部状態に戻ることができてしまう。これを防ぐには、逆流止めにイプシロン辺を入れるが、イプシロン辺はまた別な問題を引き起こす。イプシロン辺とは別なブリッジ辺/ワープ辺を設けるか。

イプシロン記号じゃなくてワープ記号というのを入れて、ワープ記号も含めて決定性ならいいのか。ニードル(カレント状態ポインタ)は、入力記号を保持した状態(=インスタンス側のニードルを動かさないで)ワープ辺を必要なだけたどれる。

つまり、(何種類かの)終端記号と1つのワープ記号を準備すればいいのだな。これらの特殊記号もディスパッチラベルとして使えばいいのだ。ディスパッチラベルは:

  1. 型名 integer, boolean, ...
  2. タグ名 @foo, @*
  3. プロパティ名 "foo": *:
  4. スカラーリテラル 1, "hello" など
  5. 終端記号、'}', ']', '$'
  6. ワープ記号 #warp

このなかでユニオン弁別子に使えるのは:

  1. 型名 integer, boolean, ...
  2. タグ名 @foo
  3. スカラーリテラル 1, "hello" など。