最近、私は純粋なJavascriptのいくつかのプロジェクトにパーサーコンビネーターを使用しています。コードを別のプロジェクトに引き出しました。ここで見つけることができます。このアプローチは、@ DigitalRossが提案した再帰下降パーサーに似ていますが、パーサーに固有のコードと一般的なパーサーの簿記コードがより明確に分割されています。
あなたのニーズに合ったパーサー(私があなたの要件を正しく理解していれば)は次のようになります:
var open = literal("{"), // matches only '{'
close = literal("}"), // matches only '}'
normalChar = not1(alt(open, close)); // matches any char but '{' and '}'
var form = new Parser(function() {}); // forward declaration for mutual recursion
var block = node('block',
['open', open ],
['body', many0(form)],
['close', close ]);
form.parse = alt(normalChar, block).parse; // set 'form' to its actual value
var parser = many0(form);
そして、あなたはそれをこのように使うでしょう:
// assuming 'parser' is the parser
var parseResult = parser.parse("abc{def{ghi{}oop}javascript}is great");
解析結果は構文木です。
このライブラリは、バックトラックに加えて、パーサー呼び出しの間に優れたエラーメッセージとスレッドユーザー状態を生成するのにも役立ちます。後者の2つは、中括弧のエラーメッセージを生成するのに非常に役立ち、次の場合に問題と問題のある中括弧トークンの場所の両方を報告します。1)中括弧が開いているが、閉じていない。2)中括弧の種類が一致していません-つまり(...]
、または{...)
; 3)一致するオープンのないクローズブレース。