Grako以EBNF(扩展巴科斯-诺尔范式)的变体作为输入,输出Python中的记忆化PEG(解析表达式语法)/Packrat解析器。
项目描述
- 至少对于那些给我发邮件告诉我他们正在设计一种新语言的人来说,一般的建议是:做这个是为了了解如何编写编译器。除非你与某个能够大力推动的组织挂钩,否则不要期望任何人会使用它。这是一个彩票,有些人可以买很多张票。有很多比C语言更漂亮的语言(比C语言更漂亮),但都没有流行起来。但有人确实中了彩票,至少做一种语言会教会你一些东西。
- Dennis Ritchie (1941-2011)
《C》编程语言和《Unix》的创造者
Grako
注意: GRAKO的开发已停止
如果您对这项技术或未来开发(如对左递归的正确支持)感兴趣,请关注Tatsu项目。
Grako(用于语法编译器)是一个工具,它以EBNF(巴科斯-诺尔范式)的变体作为输入,并输出Python中的记忆化(Packrat)PEG解析器。
Grako 还可以将存储在字符串中的语法编译成可以用来解析任何给定输入的 Grammar 对象,就像 Python 的 re 模块使用正则表达式一样。
Grako 与其他 PEG 解析器生成器不同。
生成的解析器使用 Python 非常高效的异常处理系统进行回溯。 Grako 生成的解析器只需断言必须解析的内容。没有复杂的 if-then-else 序列用于决策或回溯。记忆化允许以线性时间多次遍历相同的输入序列。
正向和负向先行符 以及 cut 元素(及其清理记忆化缓存)允许在语法级别进行额外的、手工优化的优化。
将 词素 的解析委托给 Python 的 Python 的 re 模块,允许进行(类似 Perl 的)强大且高效的词法分析。
使用 Python 的 Python 的 上下文管理器 可以显著减少生成的解析器的大小,提高代码清晰度和 CPU 缓存命中率。
包含文件、规则继承和规则包含赋予了 Grako 语法相当的表达能力。
自动生成 抽象语法树 和对象模型,以及 模型遍历器 和 代码生成器,使分析和翻译变得可行。
解析器生成器、运行时支持和生成的解析器的循环复杂度可测量地低。大约有 5 KLOC 的 Python 代码,可以在单次会话中研究其所有源代码。
唯一的依赖项是 Python 的标准库,但如果有安装,将使用 regex 库,如果可用,则使用 colorama 在跟踪输出中。生成图表需要 pygraphviz。
Grako 功能齐全,目前正在使用复杂语法解析、分析和翻译成千上万行输入文本,包括多种编程语言中的源代码。
理由
Grako 的创建是为了解决多年来使用解析器生成工具时遇到的一些反复出现的问题。
一些编程语言允许使用 关键字 作为标识符,或者符号的语义取决于上下文(例如 Ruby)。解析器需要控制词法分析以处理这些语言。
LL 和 LR 语法因处理源语言中歧义结构的无数先行符而变得复杂。 PEG 解析器从一开始就解决了歧义问题。
将语法与实现语法的代码分开,并使用已知语法语法的变体(例如 EBNF)允许语言描述具有完全的声明性能力。通用编程语言无法胜任这项任务。
语义动作 不属于 语法。它们在解析和翻译时又增加了一种需要处理的编程语言:源语言、语法语言、语义语言、生成的解析器语言和翻译的目标语言。大多数语法解析器不会检查嵌入的语义动作的语法,因此错误会在尴尬的时刻报告,并且与生成的代码而不是与语法相冲突。
预处理(如处理包含文件、固定列格式或通过缩进的结构)属于精心设计的程序代码;而不在语法中。
招聘了解主流编程语言(如Python)的帮助相对容易,但要想找到能处理复杂语法描述语言的帮助则很难。 Grako 语法的精神类似于《翻译与口译入门》课程(如果对大学生来说某事难以解释,那么它可能过于复杂,或者理解不够深入)。
生成的解析器应该易于人类阅读和调试。有时查看生成的源代码是找到语法、语义动作或解析器生成器本身问题的唯一方法。相信一个自己无法理解的生成代码是不方便的。
Python 是处理语言解析和翻译的绝佳语言。
文档
完整的文档可在 Grako 的主页上找到。
许可证
Copyright (C) 2017 by Juancarlo Añez
Copyright (C) 2012-2016 by Juancarlo Añez and Thomas Bragg
您可以在随附的 LICENSE.txt 文件所述的 BSD 风格许可下使用 Grako。 如果您的项目需要不同的许可 请 发送邮件。
变更
有关详细信息,请参阅变更日志。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。