Javascriptのパーサコンビネータを試す
30分プログラム、その225。Javascriptでパーサが書きたくなったのでJavascirpt版Parsecを試してみた。
ドキュメントがなくて苦労しているけど、全部自前で書くのに比べたら楽。
今のところ分った使い方は、
- a <|> b のかわりにa.l(b)メソッド
- do{a; b; c}のかわりにa.$(b.$(c))
- 返す値をいじりたい場合は、retメソッドを使う
- charのかわりにchr
- Lexerがないので空白もちゃんと意味を持つことに注意
- 自己再帰や相互再帰はp('...')で実現する
使い方
var parser = new DuceParser('<foo>[<bc>aa]') var result = parser.xml.parse(); if(result.success()){ console.log(result.result); }else{ console.log('fail'); }
ソースコード
// include var DuceParser = Inforno.Parsec.Parsers.define(function(){ with(this){ this.alpha = chrLike(function(c){ return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')}); this.dash = chr('-'); this.chars = many(alpha.l(dash)).ret(function(cs){ return cs.join(''); }); this.ident = alpha.$(chars).ret(function(a,b){ return a+b; }); this.tag = between(chr('<'),p('ident'),chr('>')) this.xml = tag.$(ident.l(between(chr('['),p('xml'),chr(']')))); }});