ircmaxell / php-yacc
PHP YACC 解析器生成器库
Requires
- php: >=7.0
Requires (Dev)
- phpstan/phpstan: >=0.8
- phpunit/phpunit: >=6.3
README
这是将 kmyacc
移植到 PHP 的版本。它是一个解析器生成器,意味着它接受一个 YACC 语法文件并生成一个解析器文件。
直接移植(目前)
目前,这是一个直接移植。这意味着它与 kmyacc
完全相同。在示例中,你可以看到这意味着你必须除了语法之外还提供“解析器模板”。
长期目标,我们希望添加简化功能。我们始终支持提供模板,但我们将提供一系列默认模板以供常见用例使用。
我可以用它做什么?
你可以解析大多数有结构和无结构的语法。对于LALR(1)解析器有一些需要注意的陷阱(例如,Shift/Shift 冲突和 Shift/Reduce 冲突)。但这些超出了本简单介绍的范围。
它是如何工作的?
我不知道。我只是将代码移植到正确工作。
YACC 语法
这超出了本文档的范围,但请查看这里的 YACC 页面以获取一些信息。
随着时间的推移,我们将更多地记录语法...
我该如何使用它?
目前,请查看示例文件夹。当前的 CLI 工具的状态将会改变,因此今天的使用应该提供反馈和用例,以便我们可以更好地设计工具支持。
你为什么要这样做?
许多项目都需要解析器(因此需要解析器生成器)。Nikita 的 PHP-Parser 是一个使用 kmyacc 生成其解析器的工具之一。还有许多其他项目,要么使用手写的解析器,要么使用 kmyacc 或其他解析器生成器。
不幸的是,PHP 的解析器生成器并不多。而且我发现那些存在的生成器要么很僵化,要么不够强大,无法解析 PHP 本身。
这个项目旨在解决这个问题。
性能
这里有很多可能的性能优化。原始代码是一个直接移植,因此某些结构肯定不是最优的。随着时间的推移,我们将改进性能。
然而,这始终将是一个稍微慢一点的过程。生成解析器需要大量资源,因此永远不应该在 web 请求内部发生。
但是,使用生成的解析器应该相当快(生成的解析器已经相当优化)。
还有什么要做?
有很多事情要做。以下是愿望清单
- 重构以使约定一致(一些部分当前使用驼峰式命名,一些部分使用 snakeCase,等等)。
- 性能调整
- 尽可能多地编写单元测试
- 尽可能多地编写文档(这是一个复杂的算法系列,两个项目中都没有源文档)。
- 重新设计 CLI 二进制文件及其操作方式
- 决定是否值得支持多语言,或者我们是否应该仅支持 PHP 代码生成。
- 添加默认模板和解析器实现
- 其中至少有一个默认生成“AST”,类似于Ruby的Treetop库
- 构建一个性能合理的词法分析器生成器(很可能是一个独立的项目)
- 大量的调试(尽管我们不知道有任何错误,但它们确实存在)
- 构建出我们最初迭代不需要的功能(例如,对
%union
等的支持)
还有更多。