困った。pt_parseを使おうが、ast_parseを使おうが、マッチ文字長が0のノードが消えてしまう。
文法:
nums = *int_p
alps = *alpha_p
nums_alps = nums >> alps
入力:
"ABC"
出力(pt_parseの戻り値のtrees。idはルール名に置き換え):
nums_alps
alps
alps A
alps B
alps C
入力:
"0ABC"
出力:
nums_alps
nums
nums 0
alps
alps A
alps B
alps C
入力:
""
出力:
(ID=0な空のノード一つ)
構文木のnumsに対応する部分を処理するとき、numsが消えているかどうか、もっと言えばnums_alps自体が消えているかどうかをいちいちチェックしないといけないわけですか? 構文解析後なのに? 意味が分かりません。
トレースしてみたら、boost_1_35_0/boost/spirit/tree/common.hppのconcat_match()内でlength()==0故にマッチ情報が捨てられてしまうみたい。えー、ちゃんと連結してくれよー。何か意図があるのかな。
独自のポリシークラスで処理すれば何とかなるんだろうけど、メンテナンスのことを考えるとそこまではしたくないので、この方向はあきらめることにする。
なので、次はクロージャでなんとかする方向で考えてみる。構文定義部分が汚くなっちゃうけどしかたない。