Parlot是一个快速、轻量级和简单易用的.NET解析器组合器。Parlot提供了一个基于解析器组合器的fluentAPI,提供了一个更可读的语法定义。
与所有其他已知的.NET解析器组合器相比,Parlot速度更快,分配更少。
FluentAPI提供了简单的分析器组合器,这些组合器可以用来表达更复杂的表达式。这个API的主要目标是提供和易于阅读的语法。另一个优点是,语法是在运行时建立的,而且可以动态地扩展。
示例(源码):
publicstaticreadonlyParser<Expression>Expression;staticFluentParser(){/**Grammar:*expression=>factor(("-"|"+")factor)*;*factor=>unary(("/"|"*")unary)*;*unary=>("-")unary*|primary;*primary=>NUMBER*|"("expression")";*///TheDeferredhelpercreatesaparserthatcanbereferencedbyothersbeforeitisdefinedvarexpression=Deferred<Expression>();varnumber=Terms.Decimal().Then<Expression>(staticd=>newNumber(d));vardivided=Terms.Char('/');vartimes=Terms.Char('*');varminus=Terms.Char('-');varplus=Terms.Char('+');varopenParen=Terms.Char('(');varcloseParen=Terms.Char(')');//"("expression")"vargroupExpression=Between(openParen,expression,closeParen);//primary=>NUMBER|"("expression")";varprimary=number.Or(groupExpression);//TheRecursivehelperallowstocreateparsersthatdependonthemselves.//("-")unary|primary;varunary=Recursive<Expression>((u)=>minus.And(u).Then<Expression>(staticx=>newNegateExpression(x.Item2)).Or(primary));//factor=>unary(("/"|"*")unary)*;varfactor=unary.And(ZeroOrMany(divided.Or(times).And(unary))).Then(staticx=>{//unaryvarresult=x.Item1;//(("/"|"*")unary)*foreach(varopinx.Item2){result=op.Item1switch{'/'=>newDivision(result,op.Item2),'*'=>newMultiplication(result,op.Item2),_=>null};}returnresult;});//expression=>factor(("-"|"+")factor)*;expression.Parser=factor.And(ZeroOrMany(plus.Or(minus).And(factor))).Then(staticx=>{//factorvarresult=x.Item1;//(("-"|"+")factor)*foreach(varopinx.Item2){result=op.Item1switch{'+'=>newAddition(result,op.Item2),'-'=>newSubtraction(result,op.Item2),_=>null};}returnresult;});Expression=expression;}
评论