注釈付きでマークされた文字列の解析 #9

colon_forbiddenによるモードの導入によって、
構文規則を実装するソースが少々ややこしくなって見づらい。
コロンを含んでよいか否かの情報を構文解析系から字句解析系へ渡さなければならなくなった原因は、
字句解析系に二種類の文字列を表す終端記号を要求する構文規則にある。

そこで、字句解析系には括弧もコロンも含まれていない文字列を表す終端記号だけを要求して、
文字列にコロンが含まれても構わない場合は構文規則でこれを定めることにする。
この変更で、字句解析系は、括弧もコロンも含まれていない終端記号STRING_EXCEPT_SPECIALか、
括弧またはコロンを表すリテラル文字トークンかを返せばよいようになるはずである。
つまり、構文解析系の文脈に依存する情報は必要なくなる。

BNFを書いてみる。

<text> ::= <string-headed> | <marked-string-headed>
<string-headed> ::= <string-except-parenthesis> | <string-except-parenthesis> <marked-string-headed>
<marked-string-headed> ::= <marked-string> | <marked-string> <marked-string-headed> | <marked-string> <string-headed>
<marked-string> ::= "(" <marked-string-body-with-annotation> ")"
<marked-string-body-with-annotation> ::= <string-except-special> | <string-except-special> ":" <string-except-parenthesis>
<string-except-parenthesis> ::= <string-except-special> | ":" | <string-except-parenthesis> <string-except-special> | <string-except-parenthesis> ":"

単に#6の構文規則では終端記号だった<string-except-parenthesis>の生成規則を追加して非終端記号としただけである。