自分のソフトに喰わせる、ある記述で、SEGVというエラーメッセージが出るという話。
原因は文法ファイルでは記述しにくいシンタックスエラーなので、
コードジェネレーション時に検出するべきところ、検出ルーチンが
入ってなく、NULLポインターを参照しようとしたのである。
ランタイムにOSがSEGVを検出するのであるが、SEGVというのは何とも
ピントはずれなメッセージであるといつも思う。
NULLポインター参照とかいうメッセージにしてくれればいいのであるが・・
とまぁ、OSのメッセージに文句を言っても仕方がないのである。
文法ファイルでエラーを検出できるとずいぶん楽になり、
特にエラー箇所のテキストまで特定できるのであるが、
コードジェネレーションで検出すると、自前で全部やらなくては
いけない上に、エラーテキストがモジュールの最後の(})となって
情報量がなくなってしまう。
このあたりを何とかしようとしたら、やはりケースを細かく分類して
文法ファイルで全て書き下すしかないのだろう。
言語仕様がブロック構造の最下位の動作のいくつかが上位構造によって
選択的に実行できるような構造になっているため、ブロック構造の
記述という、最下位動作以外に何も違わない似て非なる文法記述を
たくさん書かなくてはいけないのは、どうも気持ちが悪い。
他の手段としては、レキシカルアナライザのトークン切り出しと
シンタックス処理系を連携し、再帰下降だけに任せず自前の処理で
判定するというもの。
これはうまく行きそうだけれど、二つの系の間の独立性を弱めるので
ソフトウェア設計的にはきれいではない。
とりあえず、全体の再構成は少し時間をかけて検討しよう。