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」の位置にはキーワードを置けないが、それ以降には使用可能)