[Clojure]
パーサコンビネータライブラリfnparse
Clojure版のHTML::Template実装 (https://github.com/John-Poplett/html-template) を解読するためにこのページを作った。ここを参考に…
fnparse
HTML::Template
- HTML::Templateの仕様はここを見ればよい
- 仕様
タグ | 概要 |
---|---|
TMPL_VAR | 単純な文字列補間(string interpolation) |
TMPL_LOOP | 配列で文字列補間 |
TMPL_INCLUDE | ファイルから読み取った文字列で置換する |
TMPL_IF | 条件付きの文字列補間 |
TMPL_ELSE | 条件付きの文字列補間 |
TMPL_UNLESS | 条件付きの文字列補間 |
John-Poplett/html-template
John-Poplett氏のHTML::Templateは、common-lispの実装を元にしている。
例えば以下のようなタグを含んだHTMLを受け取ると
<table border=1> <!-- TMPL_LOOP rows --> <tr> <!-- TMPL_LOOP cols --> <!-- TMPL_IF colorful-style --> <td align="right" bgcolor="pink"><!-- TMPL_VAR content --></td> <!-- TMPL_ELSE --> <td align="right" ><!-- TMPL_VAR content --></td> <!-- /TMPL_IF --> <!-- /TMPL_LOOP --> </tr> <!-- /TMPL_LOOP --> </table>
以下のようなClojureコードを生成する
(defn template-code [values] (println "<table border=1>") (doseq [rows (get values :rows)] (println "<tr>") (doseq [cols (get rows :cols)] (if (get cols :colorful-style) (do (print " <td align=\"right\" bgcolor=\"pink\">") (print (get cols :content)) (println "</td>")) (do (print " <td align=\"right\" >") (print (get cols :content)) (println "</td>")))) (println "</tr>")) (println "</table>"))
とりあえず概要としてはこんな感じ、HTML::TemplateとJohn-Poplett HTML::Templateは仕様に差がある。
タグの属性値に文字列補間のキーを入れるか否かだ。
パーサジェネレータinstaparse
instaparseは EBNF(Extended Backus–Naur Form) によるパーサジェネレータ−。
- みどりねこ日記 - instaparseで遊ぶ
- パーサの定義の参考になる
lang ::= (expr | def)+ def ::= var '=' expr ';'* expr ::= (var | app | abs) | '(' app | abs ')' ';'* var ::= [a-zA-Z-]+ app ::= expr expr abs ::= '\\' var '->' expr