xp-forge/parse

此包已被弃用且不再维护。未建议替代包。

根据规则解析代码

v4.0.0 2020-10-04 14:57 UTC

This package is auto-updated.

Last update: 2021-11-04 19:59:33 UTC


README

Build Status on TravisCI XP Framework Mdodule BSD Licence Requires PHP 7.0+ Latest Stable Version

根据规则解析代码。

示例

以下示例使用基于 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(',')) 将解析函数的参数。允许悬挂分隔符。