interitty/tokenizer

使用正则表达式将给定的字符串分割成标记。

v1.0.7 2024-09-01 12:13 UTC

This package is auto-updated.

Last update: 2024-09-01 10:13:41 UTC


README

使用正则表达式将给定的字符串分割成标记。

要求

安装

安装interitty/tokenizer的最佳方式是使用Composer

composer require interitty/tokenizer

Tokenizer 使用

标记化过程需要定义一个map(从标记正则表达式到标记类)以及需要标记化的string。一个简单的将字符串分割成数字、空白和字母的标记器可以如下所示。

$tokenizer = new Tokenizer('say 123');
$tokenizer->map = [
    'number' => '~^\d+~',
    'whitespace' => '~^\s+~',
    'string' => '~^\w+~'
];

处理标记

可以通过迭代 nextcurrent 方法来访问标记,直到出现 TOKEN_END

$tokens = [];
do {
    $token = $tokenizer->next();
    $tokens[] = $token;

    assert($token === $tokenizer->current());
} while ($token->getType() !== Token::TOKEN_END);

结果数组 $tokens 将如下所示。

[
    new Token('string', 'say', 1, 1),
    new Token('whitespace', ' ', 1, 4),
    new Token('number', '123', 1, 5),
]

跳过不必要的标记

在某些情况下,自动跳过一些标记并转到其他标记可能是有用的。因此,存在 addSkippedTokenTypesetSkippedTokenTypes 方法。不能跳过 TOKEN_END 标记。

$tokenizer->addSkippedTokenType('whitespace');

$string = '';
do {
    $token = $tokenizer->next();
    $string .= $token->getValue();
} while ($token->getType() !== Token::TOKEN_END);
assert('say123' === $string);

期望标记

标记化器包含一个辅助程序来期望正确的标记类型和值。这可以简化并统一检查过程。

$tokenizer = new Tokenizer('{some coed}');
$tokenizer->map = [
    'brackets' => '~^[{}]~',
    'code' => '~^[^{}]+~',
];

$tokenizer->expect($tokenizer->next(), 'brackets', '{');
$tokenizer->expect($tokenizer->next(), 'code');

$code = $tokenizer->current()->getValue();

$tokenizer->expect($tokenizer->next(), 'brackets', '}');

BaseTokenizerParser 使用

使用 Tokenizer 的可能方式是在 BaseTokenizerParser 中,它提供了将给定字符串解析成标记流的函数。这可以用来验证给定字符串是否与预期的语法兼容,并将其解析成结构化数组。

此功能在 interitty/pacc 中使用。

BaseParser 使用

在需要使用自己实现的 Tokenizer 的情况下,存在一个 BaseParser 抽象类,它允许实现与当前和下一个 Token 交互的自定义逻辑以及与 tokenTypetokenLexeme 交互的自定义机制。