另一个PEG解析工具
mo-parsing的Python项目详细描述
更多解析!在
一个pyparsing的实验叉
Branch | Status |
---|---|
master | |
dev |
差异汇总
这是为了在moz-sql-parser中试验更快的解析。在
更多功能
- 添加了
Engine
,它控制解析上下文和空白(一个基本的lexxer) - 更快的中缀运算符解析(此fork的主要原因)
- ParseResults指向ParserElement以减小大小
- packrat解析器始终打开
- 使用较少的堆栈
- 通配符(“
*
”)可用于指示需要多个值;这是不允许的:所有值都是多值 - 所有操作都是
f(token, index, string)
形式,这与pyparsing的f(string, index token)
形式相反
更加专注
- 已删除所有向后兼容设置
- 不支持二进制序列化(不支持pickle)
功能更强
- ParseResults是静态的,不能更改,解析函数必须发出新对象
- parseRelement是静态的:许多是在语言定义期间生成的
细节
Engine
mo_parsing.engine.CURRENT
是在解析器创建过程中使用的:它是一个有效的lexxer,它具有额外的特性来简化语言定义。声明一个标准Engine
,如下所示:
with Engine() as engine:
# PUT YOUR LANGUAGE DEFINITION HERE
如果您要声明一种大型语言,并且您希望最小化缩进,并且您非常小心,您也可以使用以下模式:
^{pr2}$引擎可以用来设置全局解析参数,比如
set_whitespace()
-设置忽略的字符(如空格)add_ignore()
-包括被忽略的整个模式(如注释)set_debug_actions()
-插入要运行的函数以进行详细调试set_literal()
-设置Literal()
的定义set_keyword_chars()
-默认Keyword()
engine.CURRENT
被添加到创建的每个解析元素中,并在解析期间使用它来打包当前解析的字符串。在
浏览ParseResults
ParseResults
是n元树的形式;其子元素在{ParseResult.type
都指向制造它的ParserElement
。一般来说,如果您想对后处理(或在parseAction
中)感兴趣,您将需要导航原始tokens
以生成最终结果
有一些方便的方法
__iter__()
-允许您在depth first search中迭代解析结果。空结果被跳过,并且Group
ed结果被视为原子(如果需要可以进一步迭代)name
是{}的一个方便属性 __getitem__()
-允许您跳转到解析树中给定的name
。这会被Group
ed结果中发现的任何名称所阻止(因为组被视为原子)。在
addParseAction
解析操作是在ParserElement找到匹配项后运行的方法。在
- {py29>参数的顺序必须是
- 解析操作被包装以确保输出是合法的ParseResult
- 如果您的解析操作返回
None
,那么结果就是原始的tokens
- 如果您的解析操作返回一个对象、列表或元组,那么它将被打包到一个与
tokens
类型相同的ParseResult
。在 - 如果您的解析操作返回
ParseResult
,那么它将被接受,即使它属于其他模式
- 解析操作被包装以确保输出是合法的ParseResult
- 项目
标签: