なんというか
BMWプログラムは、ほとんど奇跡的とも言える勘で、boost::spiritを使っていたらしい。
今、最低限の仕様を満たした状態で、デバッグをしているんです。それで、構文解析系をカタカタ直していて気づいた。
spiritはLLパーサーなので、どこかでマッチに失敗すると、バックトラックするわけですよ。
その時に、spiritの内部的には正しくバックトラックするんですが、構文に引っかけてあるセマンティックアクション*1は、バックトラックされない! つまり、セマンティックアクションを起動しなかったことにできないということ。
なので、セマンティックアクションでマッチした所からガンガン構文木を作っていると、バックトラックした時にそこで作った構文木を破棄しないといけないわけです。が、それにまったく気づかずガンガン構文木作るコードにしてあったよ・・・。
気づけば当たり前のことなのに、今頃、気づいたよ・・・鈍ってるなぁ。もう、急がなければいけない時ほど、勘と頭を働かせろつうのに・・・。
BMWは、ちゃんと、情報をためてマッチしたらオブジェクト生成、という風になぜだか書いてあるんですよw あと、xml形式なので、途中まで同じ表記になっている部分もほぼ無いというのもありますが。
*1:spiritの用語で、ある構文にマッチした時に、何かの処理をさせるための仕組み