xp-forge / parse
根据规则解析代码
Requires
- php: >=7.0.0
- xp-framework/core: ^10.0 | ^9.0 | ^8.0 | ^7.0 | ^6.5
Requires (Dev)
- xp-framework/unittest: ^11.0 | ^10.0 | ^9.0 | ^8.0 | ^7.0 | ^6.5
README
根据规则解析代码。
示例
以下示例使用基于 PHP 的 tokenizer 扩展构建的 tokenizer 解析键/值对。
use text\parse\{Rules, Syntax, Tokenized}; use text\parse\rules\{ Repeated, Sequence, Token, Apply, Matches, Collect }; $syntax= new class() extends Syntax { public function rules() { return new Rules([ new Repeated( new Sequence([new Token(T_STRING), new Token(':'), new Apply('val')], function($values) { return [$values[0] => $values[2]]; }), new Token(','), Collect::$AS_MAP ), 'val' => new Matches([ T_CONSTANT_ENCAPSED_STRING => function($values) { return substr($values[0], 1, -1); }, T_STRING => function($values) { return constant($values[0]); }, T_DNUMBER => function($values) { return (double)$values[0]; }, T_LNUMBER => function($values) { return (int)$values[0]; } ]) ]); } }; $tokens= new Tokenized('a: 1, b: 2.0, c: true, d: "D"'); $pairs= $syntax->parse($tokens); // ["a" => 1, "b" => 2.0, "c" => true, "d" => "D"]
规则
以下规则可用于匹配
令牌
规则 Token(T) 匹配单个令牌 T
。
令牌
规则 Tokens(T1[, T2[, ...]]) 匹配给定令牌的任意组合。例如,new Tokens(T_STRING, '.')
可用于匹配 XP 类型名称中使用的点类型表示法。
请注意,这将匹配三个点、三个字符串或一个字符串和一个点;因此不保证语法正确性。然而,这是比更复杂规则高性能的替代方案。
应用
规则 Apply(RuleName) 将将处理延迟到通过 Rules
构造函数传递的给定命名的规则。
匹配
规则 Matches([T1 => Rule1[, T2 => Rule2[, ...]]]) 基于用于查找映射的初始令牌匹配规则。由于基于 isset()
的查找,因此高性能,但不如 OneOf
灵活。
一个或多个
规则 OneOf([Rule1[, Rule2[, ...]]]) 按指定顺序匹配规则,并返回第一个匹配规则的结果。
序列
规则 Sequence([Rule1[, Rule2[, ...]]], function) 按指定顺序匹配一组规则,并将匹配值传递给处理函数。
可选
规则 Optional(Rule, default= NULL) 匹配规则,并返回其值;如果未匹配,则返回默认值。
重复
规则 Repeated(Rule, Delim= NULL, collect= IN_ARRAY) 尽可能多地匹配规则(可选,匹配给定分隔符规则),并使用来自 text.parse.rules.Collect
枚举的收集器函数处理结果。
例如,处理参数列表,例如 new Repeated(new Apply('val'), new Token(','))
将解析函数的参数。允许悬挂分隔符。