interitty / tokenizer
使用正则表达式将给定的字符串分割成标记。
v1.0.7
2024-09-01 12:13 UTC
Requires
- php: ~8.3
- dg/composer-cleaner: ~2.2
Requires (Dev)
- interitty/code-checker: ~1.0
- interitty/phpunit: ~1.0
README
使用正则表达式将给定的字符串分割成标记。
要求
- PHP >= 8.3
安装
安装interitty/tokenizer的最佳方式是使用Composer
composer require interitty/tokenizer
Tokenizer 使用
标记化过程需要定义一个map
(从标记正则表达式到标记类)以及需要标记化的string
。一个简单的将字符串分割成数字、空白和字母的标记器可以如下所示。
$tokenizer = new Tokenizer('say 123');
$tokenizer->map = [
'number' => '~^\d+~',
'whitespace' => '~^\s+~',
'string' => '~^\w+~'
];
处理标记
可以通过迭代 next
和 current
方法来访问标记,直到出现 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),
]
跳过不必要的标记
在某些情况下,自动跳过一些标记并转到其他标记可能是有用的。因此,存在 addSkippedTokenType
和 setSkippedTokenTypes
方法。不能跳过 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
交互的自定义逻辑以及与 tokenType
和 tokenLexeme
交互的自定义机制。