提供PHP最快的词法分析器,使用命名正则表达式模式进行文本标记以提高处理效率

0.1.3 2024-09-05 17:49 UTC

This package is auto-updated.

Last update: 2024-09-05 17:52:06 UTC


README

Compliance Supported PHP Version GitHub Sponsors Code Coverage Type Coverage Psalm Level Latest Version on Packagist Downloads

提供PHP最快的词法分析器,使用命名正则表达式模式进行文本标记以提高处理效率。

安装

您可以通过composer安装此包

composer require ghostwriter/plex

如果觉得这个仓库有用,请给它加星标 ⭐️

您也可以给这个仓库加星标(🌟)以便稍后更容易找到。

使用方法

<?php

declare(strict_types=1);

use Ghostwriter\Plex\Grammar;
use Ghostwriter\Plex\Token;
use Ghostwriter\Plex\Lexer;


$grammar = Grammar::new([
    'T_NUMBER' => '\d+',
    'T_DOT' => '\.'
]);

$lexer = Lexer::new($grammar);

$expected = [
    Token::new('T_NUMBER', '1', 1, 1, []),
    Token::new('T_DOT', '.', 1, 2, []),
    Token::new('T_NUMBER', '2', 1, 3, []),
    Token::new('T_DOT', '.', 1, 4, []),
    Token::new('T_NUMBER', '3', 1, 5, []),
];

$content = '1.2.3';

assert($expected == iterator_to_array($lexer->lex($content)));

命名模式

在定义语法时,您可以使用(?&NAME)语法通过名称引用其他语法规则,其中NAME是语法规则的名称。

这允许您创建更易于阅读和维护的复杂模式。

<?php

declare(strict_types=1);

use Ghostwriter\Plex\Grammar;
use Ghostwriter\Plex\Token;
use Ghostwriter\Plex\Lexer;


$grammar = Grammar::new([
    // References both 'T_NUM' and 'ref-str' (which references T_STR)
    'T_ID' => '(?:(?&T_NUM)|(?&ref-str))*',
    
    // Matches numbers
    'T_NUM' => '\d+',
    
    // Matches word characters
    'T_STR' => '\w+',
    
    // References T_STR
    'ref-str' => '(?&T_STR)',
]);

$lexer = Lexer::new($grammar);

$expected = [
    Token::new('T_ID', '456def', 1, 6, [])
];

$content = '456def';

assert($expected == iterator_to_array($lexer->lex($content)));

鸣谢

更新日志

请参阅CHANGELOG.md以获取最近更改的更多信息。

许可证

请参阅LICENSE以获取适用于此项目的许可证的更多信息。

安全

请参阅SECURITY.md以获取有关安全披露过程的更多信息。