Parlot是一个快速、轻量级和简单易用的.NET解析器组合器。Parlot提供了一个基于解析器组合器的fluetAPI,提供了一个更可读的语法定义。
与所有其他已知的.NET解析器组合器相比,Parlot速度更快,分配更少。
FluetAPI提供了简单的分析器组合器,这些组合器可以用来表达更复杂的表达式。这个API的主要目标是提供和易于阅读的语法。另一个优点是,语法是在运行时建立的,而且可以动态地扩展。
示例(源码):
publicstaticreadolyParser<Expressio>Expressio;staticFluetParser(){/**Grammar:*expressio=>factor(("-"|"+")factor)*;*factor=>uary(("/"|"*")uary)*;*uary=>("-")uary*|primary;*primary=>NUMBER*|"("expressio")";*///TheDeferredhelpercreatesaparserthatcabereferecedbyothersbeforeitisdefiedvarexpressio=Deferred<Expressio>();varumber=Terms.Decimal().The<Expressio>(staticd=>ewNumber(d));vardivided=Terms.Char('/');vartimes=Terms.Char('*');varmius=Terms.Char('-');varplus=Terms.Char('+');varopePare=Terms.Char('(');varclosePare=Terms.Char(')');//"("expressio")"vargroupExpressio=Betwee(opePare,expressio,closePare);//primary=>NUMBER|"("expressio")";varprimary=umber.Or(groupExpressio);//TheRecursivehelperallowstocreateparsersthatdepedothemselves.//("-")uary|primary;varuary=Recursive<Expressio>((u)=>mius.Ad(u).The<Expressio>(staticx=>ewNegateExpressio(x.Item2)).Or(primary));//factor=>uary(("/"|"*")uary)*;varfactor=uary.Ad(ZeroOrMay(divided.Or(times).Ad(uary))).The(staticx=>{//uaryvarresult=x.Item1;//(("/"|"*")uary)*foreach(varopix.Item2){result=op.Item1switch{'/'=>ewDivisio(result,op.Item2),'*'=>ewMultiplicatio(result,op.Item2),_=>ull};}returresult;});//expressio=>factor(("-"|"+")factor)*;expressio.Parser=factor.Ad(ZeroOrMay(plus.Or(mius).Ad(factor))).The(staticx=>{//factorvarresult=x.Item1;//(("-"|"+")factor)*foreach(varopix.Item2){result=op.Item1switch{'+'=>ewAdditio(result,op.Item2),'-'=>ewSubtractio(result,op.Item2),_=>ull};}returresult;});Expressio=expressio;}
评论