俺言語とセミコロン

セミコロンを省略できるようにと,パーサと悪戦苦闘をしたあげく,スキャナ側で不要な改行を削るようにしてみたのだが,どうにも上手くいかなかったので,RHGのパーサの部分を読んでみた.

スキャナで処理するところまではよかったのに,その後の爪が甘かったらしい.

基本的にはセミコロンを省いても動作するようになった.



いまのところ,カッコのバランスはみていないので

 a = (
  5 )        // ok: a = (5);と等価

 b = ((5
  + 2) * 3)  // ng: b = ((5; +2)*3); と解釈される

となってしまう.

'('は文の最後(の1つ前の終端記号)にならないので,改行はスキャナで削除されるけど,'5'は文の最後になりえるので,改行がパーサに渡されてしまう.

'('と対応する')'を数えれば式の途中であることは自明なので,改行を取り除くことが出来る…ということをrubyはやっているらしい.

四則演算とかのネット上によくあるパーサの説明と違って,本物のソースは勉強になる.