stenin-nikita / php-yacc
PHP YACC 解析器生成库
Requires
- php: >=7.1
- symfony/console: >=2.8|3.*|4.*
Requires (Dev)
- phpunit/phpunit: ~6.1
- symfony/var-dumper: ~4.0
This package is not auto-updated.
Last update: 2024-09-19 17:37:48 UTC
README
这是将 kmyacc
移植到 PHP 的项目。它是一个解析器生成器,意味着它接受 YACC 语法文件并生成解析器文件。
直接移植(目前如此)
目前,这是一个直接移植。这意味着它的工作方式与 kmyacc
完全相同。查看示例,你可以看到这意味着你必须提供“解析器模板”,除了语法之外。
长期目标,我们希望添加简化功能。我们将始终支持提供模板,但我们将提供一系列针对常见用例的默认模板。
基本用法
使用 composer 安装此包
composer require stenin-nikita/php-yacc
在控制台运行命令
vendor/bin/phpyacc -s "/path/to/template" -o "/path/to/output" -c "MyParser" "/path/to/grammar.phpy"
我能用这个做什么?
你可以解析大多数结构和非结构的语法。对于 LALR(1) 解析器 存在一些需要注意的问题(例如,Shift/Shift 冲突和 Shift/Reduce 冲突)。但这些超出了本简介的范围。
它是如何工作的?
我不知道。我只是将代码移植到它正确工作。
YACC 语法
这超出了本文档的范围,但请查看 这里 YACC 页面 获取一些信息。
随着时间的推移,我们将更多地记录语法...
我如何使用它?
目前,请查看示例文件夹。当前的 CLI 工具的状态将会改变,所以今天任何使用都应提供反馈和用例,以便我们更好地设计工具支持。
你为什么要这样做?
许多项目都需要解析器(因此需要解析器生成器)。Nikita 的 PHP-Parser 是一个使用 kmyacc 生成其解析器的工具之一。还有许多其他项目,它们要么使用手写解析器,要么使用 kmyacc 或其他解析器生成器。
不幸的是,PHP 中可用的解析器生成器并不多。而且我发现那些存在的是刚性的或者不足以解析 PHP 本身。
这个项目旨在解决这个问题。
性能
这里有很多可能的性能优化。原始代码是直接移植的,所以一些结构肯定是不太优化的。随着时间的推移,我们将提高性能。
然而,这始终将是一个相对较慢的过程。生成解析器需要大量资源,所以永远不应该在 Web 请求中发生。
但是,使用生成的解析器应该相当快(生成的解析器已经相当优化)。
接下来要做什么?
很多事情。以下是我们希望清单:
- 重构以使约定一致(一些部分目前使用 camelCase,一些部分使用 snakeCase 等)。
- 性能调整
- 尽可能多的单元测试
- 尽可能多的文档(它是一系列复杂的算法,没有任何项目的源代码文档)。
- 重新设计 CLI 二进制文件及其操作方式
- 决定是否支持多语言值得,还是我们应该只转向 PHP 代码生成支持。
- 添加默认模板和解析器实现
- 其中至少有一个默认生成“AST”,类似于 Ruby 的 Treetop 库
- 构建一个性能合理的词法分析器生成器(很可能作为一个独立的项目)
- 大量的调试(尽管我们不知道有任何错误,它们确实存在)
- 构建初始阶段不需要的功能(例如,对
%union
的支持等)。
还有很多。