tmilos / lexer
使用正则表达式定义个别标记的词法分析器
1.0.2
2016-12-21 11:22 UTC
Requires
- php: >=5.5
Requires (Dev)
- phpunit/phpunit: ~5.6
- satooshi/php-coveralls: ^1.0
This package is not auto-updated.
Last update: 2024-09-14 20:04:10 UTC
README
PHP 实现的词法分析器。
警告 这不是一个像经典 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(); }