Instaparseでパーサジェネレータ
Instaparseの位置づけ
InstaparseはClojure言語による パーサジェネレータ - Wikipedia である
これのルール記述はBNFの拡張であるEBNFが使われている。
EBNFで構造化言語のルールを記述する
さっそくだが、「<p>sample</p>」を読み取るBNFのルールを書いてみた。とは言え、HTMLの複雑なルールを最初から書くのは無理なので、とりあえずタグの開始と終了を読み取れるものを作る。
しかもこのルール記述、de.setf.xml/html-grammar.bnf at master · lisp/de.setf.xml · GitHub からコピーしてきたものである。
コードサンプル
(ns sample (:require [instaparse.core :as insta])) ;; ;; https://github.com/lisp/de.setf.xml/blob/master/bnf/html-grammar.bnf ;; (def as-and-bs (insta/parser "HtmlDocument ::= Root Root ::= ElementHtml ElementHtml ::= HtmlTag | ( STag ( '/>' | ( '>' #'\\w'++ ETag ) ) ) HtmlTag ::= '<' #'\\w'++ S* '>' STag ::= '<' #'\\w'++ S* ETag ::= '</' #'\\w'++ S* '>' S ::= (' ' | '\t' | '\r\n' | '\n')+ ")) (def fool-tags "<p>sample</p>") (defn fool-sample [] (println (as-and-bs fool-tags)))
出力
- sampleのデータがきっちり構造化されて戻ってきた
lein test html-template.test [:HtmlDocument [:Root [:ElementHtml [:STag < p] > s a m p l e [:ETag </ p >]]]]
後はこれに対して指定されたキーを使ってデータを取得したりすればいいのである。