stenin-nikita/php-yacc

PHP YACC 解析器生成库

dev-master 2018-08-04 15:16 UTC

This package is not auto-updated.

Last update: 2024-09-19 17:37:48 UTC


README

StyleCI Scrutinizer CI Latest Stable Version Latest Unstable Version License

这是将 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 的支持等)。

还有很多。

贡献