困った。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故にマッチ情報が捨てられてしまうみたい。えー、ちゃんと連結してくれよー。何か意図があるのかな。
独自のポリシークラスで処理すれば何とかなるんだろうけど、メンテナンスのことを考えるとそこまではしたくないので、この方向はあきらめることにする。
なので、次はクロージャでなんとかする方向で考えてみる。構文定義部分が汚くなっちゃうけどしかたない。