p.74 ネストを許すコメントの定義
TraditionalComment :: {()} = "/*" (TraditionalComment -> {' '} / !"*/" c:Char -> c)* "*/" -> {()}
これは、以下のようでないとまずい
TraditionalComment :: {()} = "/*" (TraditionalComment -> {' '} / !"/*" !"*/" c:Char -> c)* "*/" -> {()}
ネストしたコメントの出現を許したからには、通常のコメントの中には、コメントの開始となる文字列の出現を許してはいけない。論文中に示された定義のままでは、次のようなソースにおいておかしなことになる。
/*/ comment /*/ ??? (通常のプログラム)
ネストしたコメントが許されない言語で、開始にも終了にもなる文字列 /*/
を使った病的な例である。ネストしたコメントが許される言語では、2 個目の /*/
でネストしたコメントに入り、そのままソースの終端までコメントが終了せず、予期しない EOF の出現でエラーとなるべきである。しかし、論文に示された定義では、ネストした TraditionalComment のパースが(2 個目の /*
のあと EOF まで */
が出現しないので)失敗したあと、コメント中の任意の文字列として /
が処理されて、その直後の */
でコメントの終了となり、パースが成功してしまう。
その他、執筆途中で表記を変更した際の変更し忘れと思われる誤字がちらほらとある。