charm / lexer
一个快速且强大的流式词法分析器,用于对公式、编程语言或书面语言进行标记化。
1.0.0
2021-11-15 01:03 UTC
Requires (Dev)
- phpunit/phpunit: ^9.5
This package is not auto-updated.
Last update: 2024-09-17 20:27:57 UTC
README
一个使用正则表达式匹配标记的流式词法分析器。
注意:许多有用的正则表达式已配置为Lexer类的字符串常量。
基本用法
$lexer = new Charm\Lexer(
// regex patterns
[
'NUM' => [
'\b(?<!\.)(([1-9][0-9]*|[0-9])\.[0-9]+)(?!\.)\b', // matches floats
'(?<!\.)\b([1-9][0-9]*|[0-9])\b(?!\.)', // matches integers
],
'DOUBLE_QUOTED_STRING' => '\"(\\\\\\\\|\\\\"|[^"])*"', // matches "this \" string"
'SINGLE_QUOTED_STRING' => '\'(\\\\\\\\|\\\\\'|[^\'])*\'', // matches 'this \' string'
'IDENTIFIER' => '\b[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*', // matches C/JavaScript/PHP style variable and function names
],
// exact match patterns
[
'BINARY_OPERATORS' => [
'+', '-', '*', '/',
]
]
);
foreach ($lexer->tokenize("123 + 10 * 5") as $token) {
echo "Token: ".$token->content."\n";
echo " - kind = ".$token->kind."\n";
}
空白字符将被自动丢弃。为了避免丢弃,请使用第三个参数为null构造Lexer。
$lexer = new Charm\Lexer($regexPatterns, $stringPatterns, null);
此外,必须使用正则表达式模式(如'\s+')捕获空白字符。
性能
如果提供的块/字符串足够长,词法分析器表现得相当不错。它通过创建一个大的正则表达式,然后为每种匹配的标记类型创建Token实例来实现。
为了避免产生不完整的标记,它永远不会在输入流结束时之前产生最后一个标记。