Parlot.NET 解析器组合器
Parlot 是一个快速、轻量级和简单易用的 .NET 解析器组合器。Parlot 提供了一个基于解析器组合器的 fluent API,提供了一个更可读的语法定义。
与所有其他已知的 .NET 解析器组合器相比,Parlot 速度更快,分配更少。
Fluent API 提供了简单的分析器组合器,这些组合器可以用来表达更复杂的表达式。这个API的主要目标是提供和易于阅读的语法。另一个优点是,语法是在运行时建立的,而且可以动态地扩展。
示例(源码):
public static readonly Parser<Expression> Expression; static FluentParser() { /* * Grammar: * expression => factor ( ( "-" | "+" ) factor )* ; * factor => unary ( ( "/" | "*" ) unary )* ; * unary => ( "-" ) unary * | primary ; * primary => NUMBER * | "(" expression ")" ; */ // The Deferred helper creates a parser that can be referenced by others before it is defined var expression = Deferred<Expression>(); var number = Terms.Decimal() .Then<Expression>(static d => new Number(d)) ; var divided = Terms.Char('/'); var times = Terms.Char('*'); var minus = Terms.Char('-'); var plus = Terms.Char('+'); var openParen = Terms.Char('('); var closeParen = Terms.Char(')'); // "(" expression ")" var groupExpression = Between(openParen, expression, closeParen); // primary => NUMBER | "(" expression ")"; var primary = number.Or(groupExpression); // The Recursive helper allows to create parsers that depend on themselves. // ( "-" ) unary | primary; var unary = Recursive<Expression>((u) => minus.And(u) .Then<Expression>(static x => new NegateExpression(x.Item2)) .Or(primary)); // factor => unary ( ( "/" | "*" ) unary )* ; var factor = unary.And(ZeroOrMany(divided.Or(times).And(unary))) .Then(static x => { // unary var result = x.Item1; // (("/" | "*") unary ) * foreach (var op in x.Item2) { result = op.Item1 switch { '/' => new Division(result, op.Item2), '*' => new Multiplication(result, op.Item2), _ => null }; } return result; }); // expression => factor ( ( "-" | "+" ) factor )* ; expression.Parser = factor.And(ZeroOrMany(plus.Or(minus).And(factor))) .Then(static x => { // factor var result = x.Item1; // (("-" | "+") factor ) * foreach (var op in x.Item2) { result = op.Item1 switch { '+' => new Addition(result, op.Item2), '-' => new Subtraction(result, op.Item2), _ => null }; } return result; }); Expression = expression; }
评论
nomRust 解析器组合器框架
nom是一个用Rust编写的解析器组合库。它的目标是在不影响速度或内存消耗的情况下提供构建安全解析器的工具。为此,它广泛使用Rust的强类型和内存安全来生成快速和正确的解析器,并提供函数、宏和特征来抽
nomRust 解析器组合器框架
0
Construct二进制数据解析器和构建器
Construct是一款声明式的二进制数据解析器和构建器。简而言之,它是对标准模块struct的封装和增强,适用于描述基于二进制数据通信协议的数据结构,可视为二进制数据的PythonORM库。概述您不
Construct二进制数据解析器和构建器
0
TouchJSONJSON 解析器
TouchJSON是Objective-C的JSON解析器,支持OS X和 iOS设备。基于JonathanWight的CocoaJSON http://toxicsoftware.com/cocoa
TouchJSONJSON 解析器
0
HtmlAgilityPackhtml解析器
HtmlAgilityPack是CodePlex上的一个开源项目。它提供了标准的DOMAPI和XPath导航--即使HTML不是适当的格式!示例代码:HtmlDocumentdoc=newHtmlDo
HtmlAgilityPackhtml解析器
0