短いオフサイドルールなパーサ字句解析器
HaskellやPythonオフサイドルールのパーサレキサーをjavascriptで書いてみました。
例はわざとレアなケースで書いてあります。
<script> Array.prototype.toString = function() { return "[" + this.join(",") + "]" } function run() { var ls = (document.getElementById("in").value+"\n").split(/\n/) var ts = [], ns = [-1,-1,0] for(var i = 0; i < ls.length; i++) { var m = ls[i].match(/(^\s*)(.*)/), n = m[1].length if (n > ns[ns.length-1]) ts.push("("),ns.push(n) else while (n < ns[ns.length - 1] && n <= ns[ns.length - 2]) ns.pop(),ts.push(")") if (m[2].length!=0) ts = ts.concat(m[2].split(/\s/)) } alert(ts) } </script> <textarea rows="15" cols="80" id="in"> a b c d e a b c d e d </textarea> <input type="button" onclick="run()"/>
htmlとして保存してブラウザで開くと以下のように出力されます。
[(,a,(,b,c,d,e,),),a,(,b,(,c,d,e,d,),)]
追記:
よく考えたら、パーサじゃなくて、字句解析器だった。
いろいろ書き換え。