另一个PEG解析工具

mo-parsing的Python项目详细描述


更多解析!在

一个pyparsing的实验叉

BranchStatus
masterBuild Status
devBuild Status

差异汇总

这是为了在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中迭代解析结果。空结果被跳过,并且Grouped结果被视为原子(如果需要可以进一步迭代)
  • name是{}的一个方便属性
  • __getitem__()-允许您跳转到解析树中给定的name。这会被Grouped结果中发现的任何名称所阻止(因为组被视为原子)。在

addParseAction

解析操作是在ParserElement找到匹配项后运行的方法。在

  • {py29>参数的顺序必须是
  • 解析操作被包装以确保输出是合法的ParseResult
    • 如果您的解析操作返回None,那么结果就是原始的tokens
    • 如果您的解析操作返回一个对象、列表或元组,那么它将被打包到一个与tokens类型相同的ParseResult。在
    • 如果您的解析操作返回ParseResult,那么它将被接受,即使它属于其他模式

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

推荐PyPI第三方库


热门话题
java根据选择随机设置图标   java如何将Android Studio与本地服务器数据库SQL server 2008连接?   java在点击鼠标后绘制一个椭圆形   java选项窗格相对于其父项的位置   java如何在Android中的switch case中使用String[]输入?   安卓无法从“15.0.1”确定java版本   如果满足特定条件,java是否重置计时器?   java是一个实体类,可以在OOAD中返回其他实体实例吗?   bash将对jar文件| cut | awk和java程序的调用集成到一个统一进程中   Spring安全更新身份验证成功时的最后登录日期   数据库身份验证中基于Java控制台的客户端服务器登录应用程序错误   java Selenium junit测试失败,驱动程序过早获取URL   java LibGdx多点触摸事件混淆   带扫描仪的java打印空间   来自旧版应用程序的java springcloudsleuth头   java如何实现模板设计模式?   java如何比较具有多个值的键的两个映射?   读取时R中的java MemoryError。xlsx