December 25, 2005Boost::SpiritでCMS計画 (2)[Computer]
WikiライクなCMSをBoost::Spiritという変態的なC++ライブラリを用いてつくろうという企画の『Boost::SpiritでCMS計画』。ある程度形ができてきたので、進捗状況の報告といきたいと思います。 記法をある程度定めてそれに対するアクションを定めました。記法はほぼWiki+RDです。文法の紹介を簡単にすると
ソースを公開します。Spiritを使う方の参考になれば幸いです。 細かいソースは続きをどうぞ。 ※その後、パーサとレンダラーを分離しました。 それにしてもSpiritは面白いです。さらに、構文木を生成せずにstackを使って1パスで処理するように実装したため、コードがなかなか楽しいことになっていますが。そんなこんなですが、思いついたアイデアをぼちぼち紹介していこうと思います。 今回はダイナミックパースの利用についてです。単純にパーサを書くとインライン要素が入れ子になってしまうことがあります。例えば強調の中に打ち消しがネストして、さらに打ち消しの中に強調がネストしたりするのは、実装としては簡単ですが、文法的におかしいので是非回避したいところです。そんなときはセマンティックアクションを使って動的(ダイナミック)に抑制するといいでしょう。コードをあげてみます。 struct ChangeRule{
こんなコードにしておけばネスト先で自分をネストすることを予防できます。
rule<ScannerT> &_r1, &_r2; ChangeRule(rule<ScannerT> &r1, rule<ScannerT> &r2) : _r1(r1), _r2(r2){} void operator()(IteratorT first, IteratorT last) const { _r1 = _r2; } }; rule<ScannerT> inline1_p, inline2_p; nest_off_p = nothing_p; コメント
コメントする
|
スポンサード リンク
|