parsr是纯python中一个简单的解析器组合器库。
parsr的Python项目详细描述
零件
parsr是一个小库,用于解析简单的、主要是上下文无关的语法 可能需要缩进或匹配标记的知识。
它包含一个小的组合器集合,这些组合器通过 回溯。像重写左递归和优化之类的花哨技巧 packrat不是 实现,因为目标是一个小但足以进行解析的库 非标准配置文件。它还包括一个通用数据模型 解析器可以利用嵌入式查询系统。
要了解手写解析器是如何演变成类似于这个项目的, 查看课程
解析器。query包含 通用数据模型和查询系统。
安装
- 确保已安装python2.7、python3.6或python3.7。
python3.7-m venv myproject&;cd myproject
源代码箱/激活
pip安装parsr
< > >
示例
基本体
这些是用于匹配单个字符集
字符和一些方便的对象,如数字。所有匹配都是大小写
敏感,但带有 匹配单个字符。 匹配集合中的任何单个字符。 匹配集合中的一个或多个字符。匹配是贪婪的。 匹配文本字符串。 匹配可能为负的整数或简单浮点数并返回
它的python parsr还提供singlequotedstring、doublequotedstring、quotedstring、eol,
eof、ws、anychar和其他几个原语。见底部
parsr/\uu init\uuuu.py 有几种方法可以组合原语及其组合。 要求表达式按顺序排列。 序列是优化的,因此只有第一个对象维护自己的列表
跟踪对象。注意,在其他序列中使用序列将导致
它将新序列的元素累积到它上面,这可能会影响它
如果在多个定义中使用。以确保序列在
它的定义,将其包装在一个 接受几种选择之一。从左到右检查备选方案,
并与第一个成功的站点进行检查。 选项是优化的,因此只有第一个对象维护备选方案列表。
请注意,在其他选择中将choice对象用作元素将
使它将新选择的元素累积到它上面,这可以
如果在多个定义中使用,则影响它。确保一个选择不是
"sticky"在其定义之后,将其包装在一个 匹配表达式的零个或多个匹配项。匹配是贪婪的。 因为 匹配表达式的一个或多个匹配项。匹配是贪婪的。 匹配表达式的零个或多个匹配项,直到谓词匹配为止。
匹配是贪婪的。 因为 要求一个表达式后跟另一个表达式,但不要使用输入
与后一个表达式匹配。 要求表达式不后跟另一个表达式。 所有解析器都有一个 允许多参数函数在分析器上工作。 稍后,您将使用 这是一个将几个概念联系在一起的算术解析器。进展
从一个简单的命令式样式到您在下面看到的
回购文字
的忽略大小写选项除外
字符
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
编号
int
或float
。val=Number("123")# returns 123val=Number("-12")# returns -12val=Number("12.4")# returns 12.4val=Number("-12.4")# returns -12.4
组合子
顺序
包装器
对象中。
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"]
选择
包装器
对象中。
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
许多
多个
可以匹配零个发生,所以它总是成功的。记住这一点
当在备选方案列表中使用它或使用followedby
或notfollowedby
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
可以匹配零次出现,所以它总是成功的。记住这一点
当在备选方案列表中使用它或使用followedby
或notfollowedby
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
允许递归语法,其中非终结符的定义包括
直接或间接的。最初创建一个forward
nonterminal
定期分配。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
推荐PyPI第三方库