charm/lexer

一个快速且强大的流式词法分析器,用于对公式、编程语言或书面语言进行标记化。

1.0.0 2021-11-15 01:03 UTC

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实例来实现。

为了避免产生不完整的标记,它永远不会在输入流结束时之前产生最后一个标记。