bjamの字句解析

moduleとclassの実装はそれほど面倒でもなさそうなので、Hamigaki.Bjamを復活させてフルスペックのbjamを実装してみようかなという気になってきました。


手始めに、bjamの字句解析部分(scan.cとscan.h)を読んでいたところ、

# define SCAN_NORMAL    0   // 通常
# define SCAN_STRING    1   // actionsの{}内
# define SCAN_PUNCT     2   // 区切り子以外はキーワードと見なさない

と3つのモードがあることが分かりました。
Boost.Waveのように字句解析を行う反復子を作ろうかなと思ったのですが、これらのモード切替がネックになります。

  • 構文解析器からどうやってモードを切り替えるか
  • モード切替とバックトラックの相性が悪そう

う〜ん、無理っぽいですねぇ。


ちなみに、現在のbjam_grammarはSCAN_PUNCTモードを実装していないので、

some_rule x if for while ;

のような呼び出しはできません。(「x」の位置にはキーワードを置けないが、それ以降には使用可能)