飞行器 / lex
1.0.1
2016-11-21 10:00 UTC
Requires
- phpunit/phpunit: ~4.8
- symfony/yaml: ~2.3
This package is not auto-updated.
Last update: 2024-09-20 21:37:29 UTC
README
Lex
Lexical Analyzer的PHP实现。
警告 这不是一个像传统lex那样的生成器。它不会生成任何PHP代码。它是一个简单的给定输入字符串的扫描器,通过匹配正则表达式将其标记化。因此,在运行时可以更改标记定义,并使用相同的代码为任何标记集。
用法
标记定义
在yaml文件中定义标记。键是标记的正则表达式模式,值是标记名称。所有具有空名称的模式都将被忽略,不会生成标记,但会继续扫描而不会中断。另一方面,如果扫描器遇到无法识别的块,它将引发异常。
# math.yml
\s:
\d+: number
\+: plus
-: minus
\*: mul
/: div
注意: 正则表达式模式不得包含分隔符,也不得包含字符串的开始和结束元字符(^和$)。在扫描过程中会预先加上这些。如果提供了无效的模式,则在配置加载期间将触发InvalidArgumentException。
使用回调进行扫描
使用这样的标记配置构建lex器
$lexer = new Lexer(new LexConfig(new YamlFileConfig('math.yml')));
现在您可以准备好对输入字符串进行标记化
$lexer->tokenizeAsync(' 2131 + 33 / 567', function(Token $token) { print "{$token->getToken()}({$token->getValue()})\n"; });
这将打印结果到输出
number(2131)
plus(+)
number(33)
div(/)
number(567)
扫描并返回标记数组
可选地,您可以获取所有收集到的标记到一个数组中并一起返回,而无需为单个标记提供回调
$result = $lexer->tokenize(' 2131 + 33 / 567'); print_r($result);
未知标记异常
如果输入字符串的任何位置的内容与配置中的任何正则表达式模式不匹配,则将引发UnknownTokenException,其中包含其位置的偏移量。
try { $lexer->tokenize(' 2131 + blabla'); } catch (UnknownTokenException $ex) { print $ex->getOffset(); // 8 }