2008-07-22

Boost.Spiritで構文木を作る……?

困った。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故にマッチ情報が捨てられてしまうみたい。えー、ちゃんと連結してくれよー。何か意図があるのかな。

独自のポリシークラスで処理すれば何とかなるんだろうけど、メンテナンスのことを考えるとそこまではしたくないので、この方向はあきらめることにする。

なので、次はクロージャでなんとかする方向で考えてみる。構文定義部分が汚くなっちゃうけどしかたない。