JavaScript (32) 構文解析での空白の扱い

前回でパーサージェネレーターが完成したと思っていましたが、うまくいっていませんでした。途中の空白を読み飛ばすことができないことが分かりました。今回はその対策を行い generator02 として公開しました。

前回の EBNF の中で、

token = [sp], (terminal, id).

という定義を行いこの右辺の冒頭の部分 [sp] で空白を読み飛ばそうと考えたのですが、カンマやイコールなどの記号が token という定義を通らないので、その直前の空白のところでエラーになっていました。

Small Basic でパーサージェネレーターを作ったときは、BNF による構文の定義の中で [] という空白を明に指定することでこの問題を回避していました。この方法は (E)BNF による構文の定義の中に [] が何度も出現して多少煩雑になります。

一般のケースでは字句解析の中で空白やコメントを読み飛ばす方法がとられているようです。そこで、字句解析のクラス Lex を書き換えようと思ったのですが、リテラル(定数)の表記を認識できないとリテラルの中で空白の読み飛ばしを抑止できないという問題にぶつかり、Lex の改造は断念しました。結局今回はパーサージェネレーターのクラス EBNFParser のコンストラクタにリテラルとして扱う非終端記号を配列 gapFree として渡すことで問題を解決しました。

人間がプログラムを書くときは、適宜空白を読み飛ばす処理を入れればいいだけのことですが、それを自動的にコンピューターにやらせようとすると、条件を明確に与える必要があり、プログラミングの歯がゆさを痛感しました。

コメントを残す