December 04, 2005

Boost::SpiritでCMS計画

このサイトも長く続けているもので、だんだんとコンテンツが増えてきたため、ブログスタイルのみでの運営には多少無理がでてきたように感じています。アクセスログを見ていると、Google大先生にも嫌われ始めましたし(笑)。

そういうことで、テーマごとにまとめページを作ろうと考えているのですが、自分でWikiライクなCMSを作ろうかと考えています。それというのもBoostというC++ライブラリの中にあるパーサジェネレータ(文法解析器)、Spiritに最近はまりりつつあるからです。

このSpirit、文法を定義するためのBNFという記法があるのですが、ほぼそれをそのまま記述するだけで、パーサを作ることができます。当初は実験でできたログファイルの処理をスクリプト言語以外でも簡単にできないかな程度に思って使い出したのですが、実際使ってみるととても簡単でその魅力にはまってしましいました。

現在は文法を考えています。

wiki = wiki_begin
    >> *(wiki_line | blank_line)
    >> wiki_end;

wiki_begin = str_p("=begin") >> *blank_p >> eol_p;
wiki_end = str_p("=end") >> *blank_p >> (eol_p | end_p);

special_char = ch_p('<') | ch_p('>');

unescaped_p = special_char | (anychar_p - blank_p - eol_p - end_p);
escaped_p = ch_p('\"')
    >> !(*(str_p("\"\"") | (anychar_p - ch_p('\"') - end_p))
        >> ch_p('\"'));
strong_p = str_p("''")
    >> !(+(escaped_p | (unescaped_p - str_p("''")))
        >> str_p("''"));
link_p = str_p("[[")
    >> !(+(escaped_p | (unescaped_p - str_p("]]")))
        >> !(+blank_p >> +(escaped_p | (unescaped_p - str_p("]]"))))
        >> str_p("]]"));

word_chars = +(strong_p | link_p | escaped_p | unescaped_p);

block = *blank_p >> word_chars;
blocks = +block;

header_element = repeat_p(1, 5)[ ch_p('!') ] >> blocks;
ul_element = repeat_p(1, 3)[ ch_p('+') ] >> blocks;
ol_element = repeat_p(1, 3)[ ch_p('-') ] >> blocks;
other_element = blocks - wiki_end;

blank_line = *blank_p >> eol_p;
wiki_line = (
        header_element |
        ul_element |
        ol_element |
        other_element
    ) >> eol_p;


とりあえずWikiっぽいものを考えてみました。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/446
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。