最近,我一直在使用解析器組合在純JavaScript的一些項目。我將代碼抽取到一個單獨的項目中; you can find it here。這種方法類似於@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");
的解析結果是一個語法樹。
除了回溯,該庫還可以幫助您在解析器調用之間生成漂亮的錯誤消息和線程用戶狀態。後兩個我發現對於生成大括號錯誤消息非常有用,在出現以下情況時,報告問題以及出錯的大括號標記的位置:1)有一個開放的大括號,但沒有關閉; 2)存在不匹配的支具類型 - 即(...]
或{...)
; 3)沒有匹配打開的近端大括號。
是的,我去了遞歸下降。這可能需要一些解釋來闡明這個概念,但在此之後,代碼是非常可讀的,流程是不言而喻的。 – slezica 2013-02-21 13:16:47