php-parser:基于 Go 语言的 PHP 语法解析器项目

PHP parser written in Go

分支11Tags12
文件最后提交记录最后更新时间
5 年前
5 年前
5 年前
6 年前
6 年前
6 年前
8 年前
8 年前
7 年前
8 年前
5 年前
5 年前
6 年前
6 年前
8 年前

用 Go 语言编写的 PHP 解析器

用 Go 语言编写的 PHP 解析器

GoDoc 构建状态 Go 评价卡 可维护性 测试覆盖率

本项目使用 goyaccragel 工具创建 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 结构中。

  • 对于 ClassInterfaceTraitFunctionConstant 节点,它将带有当前命名空间的名称保存下来。
  • 对于 NameRelativeFullyQualified 节点,它解析 use 别名并保存完全限定名称。