grako将ebnf变体中的语法作为输入,并在python中输出一个记忆peg/packrat解析器。

grako的Python项目详细描述


格拉科

注意: Grako的开发已经停止

如果您对这项技术感兴趣,或者对未来的发展感兴趣,比如对左递归的适当支持,那么请遵循 tatsu 项目。


grako (对于 语法编译器 )是一个工具,它以 ebnf 的变体中的语法作为输入,并输出 备忘 packrat peg python中的解析器

grako 还可以将存储在字符串中的语法编译成一个 语法 对象,该对象可用于解析任何给定的输入,这与Re模块处理正则表达式非常相似。

grako 与其他 peg 解析器生成器不同:

  • 生成的解析器使用python的非常高效的异常处理系统来回溯。 grako 生成的解析器只是断言必须解析的内容。没有复杂的 if then else 序列用于决策或回溯。记忆允许在线性时间内多次重复相同的输入序列。
  • 正面和负面的lookaheads ,以及 cut 元素(以及它对记忆缓存的清理)允许在语法级别进行额外的手工优化。
  • 委托给python的功能强大、高效的词法分析。
  • 使用python python 上下文管理器 大大减少了生成的解析器的大小,从而提高了代码的清晰度和cpu缓存的命中率。
  • include文件、规则继承和规则包含为语法提供了相当大的表达能力。
  • 自动生成抽象语法树和对象模型,以及模型漫游器和代码生成器,使分析和翻译更容易理解。

解析器生成器、运行时支持和生成的解析器的圈复杂度非常低。在5 kloc 处,可以在一个会话中研究它的所有源代码。

唯一的依赖项是python的标准库,但如果安装了regex,则将使用该库,如果可用的话,跟踪输出将使用colorama。 生成图表需要pygraphviz

grako 功能齐全,目前正与复杂的语法一起用于解析、分析和翻译数十万行输入文本,包括几种编程语言的源代码。

基本原理

创建grako是为了解决在使用解析器生成工具的几十年中遇到的一些反复出现的问题:

  • 有些编程语言允许使用关键字作为标识符,或者根据上下文对符号有不同的含义( ruby )。解析器需要控制词法分析才能处理这些语言。
  • ll和lr语法被无数的lookahead语句污染,以处理源语言中的不明确结构。 peg 解析器从一开始就解决歧义。
  • 将语法从实现语义的代码中分离出来,并使用著名语法语法的变体( ebnf )允许在语言描述中使用完全的声明能力。通用编程语言不能胜任此任务。
  • 语义动作不属于语法。它们创建了另一种编程语言来处理解析和翻译:源语言、语法语言、语义语言、生成的解析器语言和翻译的目标语言。大多数语法分析器不检查嵌入的语义动作的语法,因此错误会在尴尬的时刻报告,并根据生成的代码报告,而不是根据语法报告。
  • 预处理(例如处理include、固定列格式或通过缩进的结构)属于精心设计的程序代码,而不是语法。
  • 很容易招募具有主流编程语言(如python)知识的帮助,但使用复杂的语法描述语言很难找到帮助。 grako 语法遵循的是"笔译和口译101"课程的精神(如果有些东西很难向大学生解释,可能太复杂,或者不太容易理解)。
  • 生成的解析器应该很容易被人读取和调试。查看生成的源代码有时是在语法、语义操作或解析器生成器本身中发现问题的唯一方法。信任生成的无法理解的代码是不方便的。
  • python 是处理语言解析和翻译的好语言。

文档

完整的文档可在 grako 主页上找到。

更改

有关详细信息,请参见更改日志。

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

推荐PyPI第三方库


热门话题
java ProcessBuilder在使用多个参数时运行不正常   java如何使用Spring数据ORM/JPA创建EntityManagerFactory?   将Velocity宏转换为Java指令   internet上的Java TCP/IP服务器客户端通信   java为什么JDK 8允许一个局部内部类(在方法内部)访问封闭方法的非最终局部变量?   基于Java的比率算法   java应用程序在选择列表首选项时出错   java保存对象以供以后使用   java如何使用MySQL JDBC驱动程序连接Android和MySQL   java Zipkin可以用于控制台应用程序   java单击刷新Servlet页面显示重复内容   java如何递归地反转字符串数组?   java如何使用inputStream作为outputStream的文本?   java扩展令牌选择操作符   java在映射中使用通用枚举类   arraylist如何使用JAVA流从对象列表中查找平均值   windows将FileInputStream和FileOutputStream传递给ffmpeg进行转码(使用JAVEJava音频视频编码)   java Ant脚本在执行CVS签出后找不到目标   重复值情况下的java插入排序,双链表ADT   java如何在Accumulo中获取数据库查询计数