FreeStyleWiki

パーサコンビネータライブラリfnparse/instaparse

このエントリーをはてなブックマークに追加

[Clojure]

パーサコンビネータライブラリfnparse

Clojure版のHTML::Template実装 (https://github.com/John-Poplett/html-template) を解読するためにこのページを作った。ここを参考に…

  fnparse

  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) によるパーサジェネレータ−。

lang ::= (expr | def)+
def  ::= var '=' expr ';'*
expr ::= (var | app | abs)
     |  '(' app | abs ')' ';'*
var  ::= [a-zA-Z-]+
app  ::= expr expr
abs  ::= '\\' var '->' expr