ircmaxell/php-yacc

PHP YACC 解析器生成器库

v0.0.7 2020-08-09 18:42 UTC

This package is auto-updated.

Last update: 2024-09-03 16:20:06 UTC


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等的支持)

还有更多。

贡献