parsr是纯python中一个简单的解析器组合器库。

parsr的Python项目详细描述


零件

parsr是一个小库,用于解析简单的、主要是上下文无关的语法 可能需要缩进或匹配标记的知识。

它包含一个小的组合器集合,这些组合器通过 回溯。像重写左递归和优化之类的花哨技巧 packrat不是 实现,因为目标是一个小但足以进行解析的库 非标准配置文件。它还包括一个通用数据模型 解析器可以利用嵌入式查询系统。

要了解手写解析器是如何演变成类似于这个项目的, 查看课程

解析器。query包含 通用数据模型和查询系统。

安装

  1. 确保已安装python2.7、python3.6或python3.7。
  2. python3.7-m venv myproject&;cd myproject
  3. 源代码箱/激活
  4. pip安装parsr
  5. < > >

    示例

    基本体

    这些是用于匹配单个字符集 字符和一些方便的对象,如数字。所有匹配都是大小写 敏感,但带有文字忽略大小写选项除外

    字符

    匹配单个字符。

    a=Char("a")# parses a single "a"val=a("a")# produces an "a" from the data.val=a("b")# raises an exception

    插图

    匹配集合中的任何单个字符。

    vowel=InSet("aeiou")# or InSet(set("aeiou"))val=vowel("a")# okayval=vowel("e")# okayval=vowel("i")# okayval=vowel("o")# okayval=vowel("u")# okayval=vowel("y")# raises an exception

    字符串

    匹配集合中的一个或多个字符。匹配是贪婪的。

    vowels=String("aeiou")val=vowels("a")# returns "a"val=vowels("u")# returns "u"val=vowels("aaeiouuoui")# returns "aaeiouuoui"val=vowels("uoiea")# returns "uoiea"val=vowels("oouieaaea")# returns "oouieaaea"val=vowels("ga")# raises an exception

    文字

    匹配文本字符串。value关键字允许您返回一个python值 而不是匹配的输入。忽略大小写关键字使大小写匹配 不敏感。

    lit=Literal("true")val=lit("true")# returns "true"val=lit("True")# raises an exceptionval=lit("one")# raises an exceptionlit=Literal("true",ignore_case=True)val=lit("true")# returns "true"val=lit("TRUE")# returns "TRUE"val=lit("one")# raises an exceptiont=Literal("true",value=True)f=Literal("false",value=False)val=t("true")# returns the boolean Trueval=t("True")# raises an exceptionval=f("false")# returns the boolean Falseval=f("False")# raises and exceptiont=Literal("true",value=True,ignore_case=True)f=Literal("false",value=False,ignore_case=True)val=t("true")# returns the boolean Trueval=t("True")# returns the boolean Trueval=f("false")# returns the boolean Falseval=f("False")# returns the boolean False

    编号

    匹配可能为负的整数或简单浮点数并返回 它的pythonintfloat

    val=Number("123")# returns 123val=Number("-12")# returns -12val=Number("12.4")# returns 12.4val=Number("-12.4")# returns -12.4

    parsr还提供singlequotedstring、doublequotedstring、quotedstring、eol, eof、ws、anychar和其他几个原语。见底部 parsr/\uu init\uuuu.py

    组合子

    有几种方法可以组合原语及其组合。

    顺序

    要求表达式按顺序排列。

    序列是优化的,因此只有第一个对象维护自己的列表 跟踪对象。注意,在其他序列中使用序列将导致 它将新序列的元素累积到它上面,这可能会影响它 如果在多个定义中使用。以确保序列在 它的定义,将其包装在一个包装器对象中。

    a=Char("a")# parses a single "a"b=Char("b")# parses a single "b"c=Char("c")# parses a single "c"ab=a+b# parses a single "a" followed by a single "b"# (a + b) creates a "Sequence" object. Using `ab` as an# element in a later sequence would modify its original# definition.abc=a+b+c# parses "abc"# (a + b) creates a "Sequence" object to which c is appendedval=ab("ab")# produces a list ["a", "b"]val=ab("a")# raises an exceptionval=ab("b")# raises an exceptionval=ab("ac")# raises an exceptionval=ab("cb")# raises an exceptionval=abc("abc")# produces ["a", "b", "c"]

    选择

    接受几种选择之一。从左到右检查备选方案, 并与第一个成功的站点进行检查。

    选项是优化的,因此只有第一个对象维护备选方案列表。 请注意,在其他选择中将choice对象用作元素将 使它将新选择的元素累积到它上面,这可以 如果在多个定义中使用,则影响它。确保一个选择不是 "sticky"在其定义之后,将其包装在一个包装器对象中。

    abc=a|b|c# alternation or choice.val=abc("a")# parses a single "a"val=abc("b")# parses a single "b"val=abc("c")# parses a single "c"val=abc("d")# raises an exception

    许多

    匹配表达式的零个或多个匹配项。匹配是贪婪的。

    因为多个可以匹配零个发生,所以它总是成功的。记住这一点 当在备选方案列表中使用它或使用followedbynotfollowedby

    x=Char("x")xs=Many(x)# parses many (or no) x's in a rowval=xs("")# returns []val=xs("a")# returns []val=xs("x")# returns ["x"]val=xs("xxxxx")# returns ["x", "x", "x", "x", "x"]val=xs("xxxxb")# returns ["x", "x", "x", "x"]ab=Many(a+b)# parses "abab..."val=ab("")# produces []val=ab("ab")# produces [["a", b"]]val=ab("ba")# produces []val=ab("ababab")# produces [["a", b"], ["a", "b"], ["a", "b"]]ab=Many(a|b)# parses any combination of "a" and "b" like "aababbaba..."val=ab("aababb")# produces ["a", "a", "b", "a", "b", "b"]

    人1

    匹配表达式的一个或多个匹配项。匹配是贪婪的。

    x=Char("x")xs=Many1(x)# parses many (or no) x's in a rowval=xs("")# raises an exceptionval=xs("a")# raises an exceptionval=xs("x")# returns ["x"]val=xs("xxxxx")# returns ["x", "x", "x", "x", "x"]val=xs("xxxxb")# returns ["x", "x", "x", "x"]ab=Many1(a+b)# parses "abab..."val=ab("")# raises an exceptionval=ab("ab")# produces [["a", "b"]]val=ab("ba")# raises an exceptionval=ab("ababab")# produces [["a", "b"], ["a", "b"], ["a", "b"]]ab=Many1(a|b)# parses any combination of "a" and "b" like "aababbaba..."val=ab("aababb")# produces ["a", "a", "b", "a", "b", "b"]

    直到

    匹配表达式的零个或多个匹配项,直到谓词匹配为止。 匹配是贪婪的。

    因为until可以匹配零次出现,所以它总是成功的。记住这一点 当在备选方案列表中使用它或使用followedbynotfollowedby

    a=Char("a")# parses a single "a"val=a("a")# produces an "a" from the data.val=a("b")# raises an exception
    0

    后跟

    要求一个表达式后跟另一个表达式,但不要使用输入 与后一个表达式匹配。

    a=Char("a")# parses a single "a"val=a("a")# produces an "a" from the data.val=a("b")# raises an exception
    1

    后面没有

    要求表达式后跟另一个表达式。

    a=Char("a")# parses a single "a"val=a("a")# produces an "a" from the data.val=a("b")# raises an exception
    2

    向左/向右

    keepleft<;)和keepright>;)匹配相邻表达式,但忽略 结果之一。

    a=Char("a")# parses a single "a"val=a("a")# produces an "a" from the data.val=a("b")# raises an exception
    3

    opt

    opt包装解析器,如果失败,则返回默认值none。那 可以使用default关键字更改值。如果 包装解析器成功,但不是其他原因。

    a=Char("a")# parses a single "a"val=a("a")# produces an "a" from the data.val=a("b")# raises an exception
    4 > map

    所有解析器都有一个.map函数,允许您将函数传递给 评估他们匹配的输入。

    a=Char("a")# parses a single "a"val=a("a")# produces an "a" from the data.val=a("b")# raises an exception
    5

    扬程

    允许多参数函数在分析器上工作。

    a=Char("a")# parses a single "a"val=a("a")# produces an "a" from the data.val=a("b")# raises an exception
    6

    前进

    forward允许递归语法,其中非终结符的定义包括 直接或间接的。最初创建一个forwardnonterminal 定期分配。

    a=Char("a")# parses a single "a"val=a("a")# produces an "a" from the data.val=a("b")# raises an exception
    7

    稍后,您将使用<;=运算符给出它的真正定义。

    a=Char("a")# parses a single "a"val=a("a")# produces an "a" from the data.val=a("b")# raises an exception
    8

    算术

    这是一个将几个概念联系在一起的算术解析器。进展 从一个简单的命令式样式到您在下面看到的 回购

    a=Char("a")# parses a single "a"val=a("a")# produces an "a" from the data.val=a("b")# raises an exception
    9

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


热门话题
java从远程安卓应用程序打开/关闭嵌套   java在每个请求上获取memcache变量导致问题   如何在java中使用itext获取pdf文件的标题   java如何使用firebase令牌发送通知?   java不能在spring数据聚合中包含嵌套字段   用于调度作业的java Cron表达式   java当我使用TabActivity 安卓时,TabActivity类型已被弃用   加密Java Bouncy Castle加密使用AES加密   awt Java,将GUI与ActionListener类分离   如何在Java中创建一个根据输入返回枚举的方法?   java什么是Gxt 3.1.1实现对话框的方法。Gxt 3.0.0是否支持getHideButton()?   java如何解决构建错误?   java XWPF POI如何设置段落中的文本而不使用换行符