PHP parser written in Go
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 5 年前 | ||
| 5 年前 | ||
| 5 年前 | ||
| 6 年前 | ||
| 6 年前 | ||
| 6 年前 | ||
| 8 年前 | ||
| 8 年前 | ||
| 7 年前 | ||
| 8 年前 | ||
| 5 年前 | ||
| 5 年前 | ||
| 6 年前 | ||
| 6 年前 | ||
| 8 年前 |
以下内容由 AI 翻译,如有问题请 点此提交 issue 反馈
用 Go 语言编写的 PHP 解析器

本项目使用 goyacc 和 ragel 工具创建 PHP 解析器。它能将源代码解析为 AST。可用于编写静态分析、重构、度量、代码风格格式化工具。
在线尝试:演示
功能:
- 完全支持 PHP 5 和 PHP 7 语法
- 抽象语法树(AST)表示
- 遍历 AST
- 解析命名空间名称
- 解析语法无效的 PHP 文件
- 保存和打印自由浮动的注释和空白
使用者
VKCOM/noverify - NoVerify 是一个相当快速的 PHP 代码分析工具
quasilyte/phpgrep - phpgrep 是一个支持语法的 PHP 代码搜索工具
使用示例
package main
import (
"log"
"os"
"github.com/z7zmey/php-parser/pkg/cfg"
"github.com/z7zmey/php-parser/pkg/errors"
"github.com/z7zmey/php-parser/pkg/parser"
"github.com/z7zmey/php-parser/pkg/version"
"github.com/z7zmey/php-parser/pkg/visitor/dumper"
)
func main() {
src := []byte(`<? echo "Hello world";`)
// Error handler
var parserErrors []*errors.Error
errorHandler := func(e *errors.Error) {
parserErrors = append(parserErrors, e)
}
// Parse
rootNode, err := parser.Parse(src, cfg.Config{
Version: &version.Version{Major: 5, Minor: 6},
ErrorHandlerFunc: errorHandler,
})
if err != nil {
log.Fatal("Error:" + err.Error())
}
// Dump
goDumper := dumper.NewDumper(os.Stdout).
WithTokens().
WithPositions()
rootNode.Accept(goDumper)
}
路线图
- 控制流图 (CFG)
- PHP8
安装指南
go get github.com/z7zmey/php-parser/cmd/php-parser
命令行界面
php-parser [flags] <path> ...
| 标志 | 类型 | 描述 |
|---|---|---|
| -p | 布尔型 | 打印文件路径 |
| -e | 布尔型 | 打印错误信息 |
| -d | 布尔型 | 以 Golang 格式转储 |
| -r | 布尔型 | 解析名称 |
| -prof | 字符串 | 启动分析器:[cpu, mem, trace] |
| -phpver | 字符串 | PHP 版本(默认值:7.4) |
命名空间解析器
命名空间解析器是一种访问者,用于解析节点的完全限定名称并将其保存到 map[node.Node]string 结构中。
- 对于
Class、Interface、Trait、Function、Constant节点,它将带有当前命名空间的名称保存下来。 - 对于
Name、Relative、FullyQualified节点,它解析use别名并保存完全限定名称。