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

前回示した状態遷移図は#1のBNFで受容されない入力を受容してしまうのだった。
入力長0の入力に対して#1のBNFはこれを受容しない。
つまり何か一文字は入力されることが受容される入力の必要条件になる。

$ echo -n  | ./parser
syntax error

のように、今までに示したプログラムならどれも構文エラーを返すはずである。
しかし前回の状態遷移図では開始状態から入力EOFで受容状態へ遷移するため、入力長0の入力を受け入れてしまう。
これは状態marked-string-bodyから開始状態へ戻る経路があることが原因なので、
状態stringか状態marked-string-bodyに必ず一度は遷移していなければEOFによりエラー状態となるようにする。
そこで新たに状態restartを設ける。状態restartはこれまでの開始状態と同じように入力に対する遷移を行う。
そして、状態marked-string-bodyから開始状態へ戻る経路の行き先をこれに置き換え、
問題の原因である開始状態から入力終了で直接に受容状態へ遷移する経路を無くする。

状態restartに至ったということは入力長は0ではなかったということなので、
この状態でEOFが来た場合は受容状態へ遷移しても問題ない。