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(']'))));
}});