tmilos/lexer

使用正则表达式定义个别标记的词法分析器

1.0.2 2016-12-21 11:22 UTC

This package is not auto-updated.

Last update: 2024-09-14 20:04:10 UTC


README

PHP 实现的词法分析器。

Author Build Status Coverage Status License SensioLabsInsight

警告 这不是一个像经典 lex 那样的生成器。它不会产生任何 PHP 代码。它是一个简单的输入字符串扫描器,通过匹配正则表达式将输入字符串分词到给定的标记集合中。因此,在运行时可以更改标记定义,并使用同一代码为任何标记集合。

标记定义

标记由 TokenDefinition 类定义,该类包含标记名称和正则表达式。标记名称可以为空,在这种情况下,词法分析器将忽略/跳过此类标记。

词法分析器配置

词法分析器配置包含所有标记定义的列表。使用 LexerArrayConfig 可以轻松地从数组创建,其中键是正则表达式,值是标记名称。

完整扫描

可以使用词法分析器的静态方法 scan($config, $input) 扫描给定的输入字符串并返回一个标记数组。

具有状态的词法分析器

可以使用 Lexer 类的实例通过单次前瞻标记遍历扫描过的标记。

在 API 上与 doctrine/lexer 类似,只是标记定义和扫描方式不同,无需从标记化值中识别标记类型/名称 - 而是标记类型/名称由提供正则表达式的相同 TokenDefn 提供。

示例

<?php
$config = new LexerArrayConfig([
            '\\s' => '',
            '\\d+' => 'number',
            '\\+' => 'plus',
            '-' => 'minus',
            '\\*' => 'mul',
            '/' => 'div',
        ]);

// static scan method that returns an array of
$tokens = Lexer::scan($config, '2 + 3');
array_map(function ($t) { return $t->getName(); }, $tokens); // ['number', 'plus', 'number']

// lexer instance
$lexer = new Lexer($config);
$lexer->setInput('2 + 3');
$lexer->moveNext();
while ($lexer->getLookahead()) {
    print $lexer->getLookahead()->getName();
    $lexer->moveNext();
}