単純なマーク付けがなされた文字列の解析 #9

状態遷移図ができたので、これに対応したコードを書こうと思ったのだが、まだ問題があった。
修正した状態遷移図でもやはり#1のBNFで受容されない入力を受容してしまう。
BNFの終端記号<marked-string-body>は一文字以上の文字からなる文字列から還元される。
が、示した状態遷移図では空文字列を受け入れてしまう。
BNFに従えば、

$ echo -n "()" | ./parser
syntax error

となるが、状態遷移図ではstart -> marked-string-body -> restart -> acceptの経路をたどり受容される。
状態stringの方はこれに遷移するために必ず一文字の入力が必要なので終端記号<string>の生成規則通りである。
問題を修正するために、状態marked-string-bodyを二つの状態marked-string-body-headとmarked-string-body-bodyに分離する。
一つはこの状態への遷移を引き受け、もう一つはこの状態からの遷移を行う。つまり、入口と出口に分ける。
二つの状態の間の遷移は括弧でない文字によって行われるようにすることで最低一文字の文字列から構成されることを保証する。
状態marked-string-bodyから自身への遷移は出口側の状態で自分へ遷移するようにすればいい。

これで状態marked-string-body-headにおいて右括弧が入力されればエラーとなる。