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っぽいものを考えてみました。

December 04, 2005 23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

コメントする