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; }
问题内容: 我想在脚本中定义不同的子解析器,两个子解析器均从同一个父级继承选项,但具有不同的默认值。但是,它没有按预期工作。 这是我所做的: 当我从命令行运行脚本时,得到的是: 显然,第二个覆盖了父对象中的第一个。由于argparse文档中没有任何内容(非常详细),所以我认为这可能是一个错误。 有一些简单的解决方案吗?之后,我可以检查变量,并使用每个子解析器的预期默认值替换值,但这就是我期望arg
基本上,我想结合这些g4文件: https://github.com/apache/groovy/tree/master/src/antlr 进入一个文件,我可以使用这个clojure库: https://github.com/aphyr/clj-antlr 它目前需要一个组合的解析器/词法器文件。如何破解这些文件,使它们以正确的语法存在于单个文件中?我已经排除了连接文件和删除lexer和para
主要内容:解析 XML 文档,解析 XML 字符串,跨域访问,XML DOM所有现代浏览器都有内建的 XML 解析器。 XML 解析器把 XML 文档转换为 XML DOM 对象 - 可通过 JavaScript 操作的对象。 解析 XML 文档 下面的代码片段把 XML 文档解析到 XML DOM 对象中: if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlht
问题内容: 我有一个类似这样的响应XML- 我想从中提取全部内容到一个字符串中。是否可以通过任何字符串函数或XML解析器来做到这一点? 请指教。 问题答案: 您可以尝试使用XPath方法简化XML解析: 请注意,我没有尝试过此代码。它可能需要调整。
CSS 选择器:BeautifulSoup4 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。 lxml 只会局部遍历,而Beautiful Soup 是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。 BeautifulSoup 用来解析 HT
简单的例子 这个例子展示了如何从字符串中加载 CSS 样式: #include <LCUI.h> #include <LCUI/gui/css_library.h> #include <LCUI/gui/css_parser.h> int main(void) { LCUI_Selector selector = Selector(".button"); LCUI_Style
问题内容: 数据结构蓝图: 使用Newtonsoft.Json,我具有以下用于Json序列化的配置。 显然,这将打印出: 现在,我需要在JsonSerializerSettings中的ContractResolver中添加另一个NullToEmptyStringResolver,如何实现如下输出: 请注意,我的NullToEmptyStringResolver已被编写。但是我需要将NullToEm
本文向大家介绍Python装饰器结合递归原理解析,包括了Python装饰器结合递归原理解析的使用技巧和注意事项,需要的朋友参考一下 代码如下: 输出如下: start memoize start memoize memorize 10 None memorize 10 None 对比代码(把注释的地方去掉后)的输出: 通过取消注释的对比,可以得到如下结论: 装饰器memoize实际上对于函数nsu