木质化 / 解析器
提供一个基于正则表达式的解析器。
dev-master
2022-07-29 11:21 UTC
Requires
- php: >=8.0
Requires (Dev)
- xylemical/composer-dev-bundle: ^0.1.0
This package is auto-updated.
Last update: 2024-08-29 06:01:58 UTC
README
将字符串转换为抽象语法树,并将抽象语法树转换为字符串。
安装
安装此库的推荐方法是通过composer。
composer require xylemical/parser
用法
标记化器
标记化器的主要用法是
<?php use Xylemical\Parser\Tokenizer; use Xylemical\Parser\Parser; $tokenizer = (new Tokenizer())->setPatterns([ 'word' => '\w+', 'whitespace' => '[ \t]+', ]); $result = $tokenizer->tokenize('This is a test scenario');
优化
优化允许通过优化来更好地对标记进行分类。
例如,一种编程语言指定关键字为[a-zA-z]+
正则表达式模式,但个别标记为if
、then
等。通过指定keyword
标记的优化,它将自动转换这些标记,当没有优化模式匹配时,默认回退到keyword
。
<?php use Xylemical\Parser\Tokenizer; $tokenizer = (new Tokenizer())->setPatterns([ 'word' => '\w+', 'whitespace' => '[ \t]+', ])->setRefinements('word', [ 'keyword' => '^[a-z]+$', ])->setRefinements('keyword', [ 'if' => 'if', 'then' => 'then', ]); $stream = $tokenizer->tokenize('if this1 then that'); // The stream would have the following tokens: // * Token('if', 'if', 1, 1) // * Token('whitespace', ' ', 1, 3) // * Token('word', 'this1', 1, 4) // * Token('whitespace', ' ', 1, 9) // * Token('then', 'then', 1, 10) // * Token('whitespace', ' ', 1, 14) // * Token('keyword', 'that', 1, 15)
标记化器的子类
通过子类化标记化器可以定义默认标记和优化。
<?php namespace Example; use Xylemical\Parser\Tokenizer as BaseTokenizer; class Tokenizer extends BaseTokenizer { protected const PATTERNS = [ 'word' => '\w+', 'number' => '-?\d+(?\.\d+)', ]; protected const REFINEMENTS = [ 'number' => [ 'float' => '^-?\d+\.\d+$', ], ]; }
词法分析器
词法分析器的子类
子类化词法分析器对于从标记化器生成的TokenStream中生成内容非常重要。
例如,以下词法分析器在发现word
标记时,会生成word
、word|number|float
对。
<?php namespace Example; use Xylemical\Parser\Lexer as BaseLexer; class Lexer extends BaseLexer { public function generate(TokenStream $stream): mixed { if ($stream->is('word')) { $word = $stream->expect('word'); $stream->expect('equals'); $result = $stream->expectOneOf(['word', 'number', 'float']); return [$word, $result]; } return NULL; } }
许可证
MIT,见LICENSE。