nabu-3/lexer

nabu-3 Lexer库,用于生成和分析词汇表达式

dev-master 2019-05-13 12:04 UTC

This package is auto-updated.

Last update: 2024-09-11 14:53:39 UTC


README

GitHub Build Status Quality Gate Status Maintainability Rating Reliability Rating Security Rating

这是一个用PHP编写的Lexer库,用于分析词汇表达式,并获得一个标记化表示和一个描述解释内容的结构化数据。

Lexer支持Unicode字符串和正则表达式。

安装

Lexer库需要PHP 7.2或更高版本以及mb_string原生模块。

该库作为composerPackagist标准PHP软件包分发的一部分。要使用此库,您只需通过composer要求它即可

composer require nabu-3/lexer

基本使用

要开始使用此库,您需要包含由composer维护的标准autoload.php文件

require_once 'vendor/autoload.php';

要开始使用此库,您可以创建一个CNabuCustomLexer对象,并提供一个Lexer数据存储

use nabu\lexer\CNabuCustomLexer;
use nabu\lexer\data\CNabuLexerData;

$lexer = CNabuCustomLexer::getLexer();
$lexer->setData(new CNabuLexerData());

此操作提供了一个自定义lexer,您可以自定义它以添加规则并在您的示例字符串上进行分析。

关键词规则

最基本的规则是关键词规则。有了它,您可以对关键词进行解析并获取标记化结果。

下面是一个使用关键词规则的基本示例

require_once 'vendor/autoload.php';

use nabu\lexer\CNabuCustomLexer;
use nabu\lexer\data\CNabuLexerData;

use nabu\lexer\rules\CNabuLexerRuleKeyword;

$lexer = CNabuCustomLexer::getLexer();
$lexer->setData(new CNabuLexerData());

$keyword_rule = CNabuLexerRuleKeyword::createFromDescriptor(
    $lexer,
    array(
        'keyword' => 'RULE',
        'method' => 'ignore case'
    )
);
$lexer->registerRule('keyword_rule', $keyword_rule);
$keyword_rule->applyRuleToContent('RULE is the basics');

var_export($keyword_rule->getTokens());
echo "\n";

允许的方法是'忽略大小写'和'字面量'。然后

  • '忽略大小写'允许在忽略大小写字母的情况下匹配关键词。内部,两个字符串(示例和关键词)都被转换为小写并比较。如果它们匹配,则解释为规则已被覆盖并返回true。
  • '字面量'强制所有字符与关键词预期完全匹配,并且规则只有当所有字符字面地匹配时才被覆盖。

您可以从终端键入以下内容来运行此示例

php samples/basic_sample_01.php

执行此示例后,您可以在您的终端中看到解析的令牌列表

array (
  0 => 'Rule',
)

请注意,列表中只有一个条目,因为关键词规则只影响关键词的一个出现。由于规则方法被定义为'忽略大小写',所以包含的令牌与示例源字符串匹配,而不是与关键词属性匹配。

正则表达式规则

此规则为多态字符串或需要使用正则表达式来解释其内容的动态结构提供了广泛的应用。像关键词规则一样,您可以将匹配应用为'字面量'或'忽略大小写',并且在使用preg_match解析正则表达式时,如果使用'忽略大小写',则应用'/i'修饰符。

下面是一个使用正则表达式规则的基本示例

require_once 'vendor/autoload.php';

use nabu\lexer\CNabuCustomLexer;
use nabu\lexer\data\CNabuLexerData;

use nabu\lexer\rules\CNabuLexerRuleRegEx;

$lexer = CNabuCustomLexer::getLexer();
$lexer->setData(new CNabuLexerData());

$regex_rule = CNabuLexerRuleRegEx::createFromDescriptor(
    $lexer,
    array(
        'match' => '\\w+',
        'method' => 'ignore case'
    )
);
$lexer->registerRule('regex_rule', $regex_rule);
$regex_rule->applyRuleToContent('RUle is the basics');

var_export($regex_rule->getTokens());
echo "\n";

允许的方法与关键词规则属性相同。

您可以从终端键入以下内容来运行此示例

php samples/basic_sample_02.php

执行此示例后,您可以在您的终端中看到解析的令牌列表

array (
  0 => 'RUle',
)

请注意,列表中只有一个条目,因为正则表达式规则只影响表达式的一个出现。由于规则方法被定义为'忽略大小写',所以包含的令牌与示例源字符串匹配,而不是与关键词属性匹配。

块规则

块规则具有将任何类型的规则分组以应用列表中的casesequencerepetition的能力。

情况规则

此规则允许将规则列表作为switch/case语句处理。然后,您可以定义此列表并应用规则。如果示例字符串至少与列表中的一项规则匹配,则应用第一个匹配的规则,并且规则评估在这里停止。

下面是一个使用情况规则的基本示例

require_once 'vendor/autoload.php';

use nabu\lexer\CNabuCustomLexer;
use nabu\lexer\data\CNabuLexerData;

use nabu\lexer\rules\CNabuLexerRuleGroup;

$lexer = CNabuCustomLexer::getLexer();
$lexer->setData(new CNabuLexerData());

$case_rule = CNabuLexerRuleGroup::createFromDescriptor(
    $lexer,
    array(
        'method' => 'case',
        'group' => array(
            array(
                'keyword' => 'Rule',
                'method' => 'ignore case'
            ),
            array(
                'keyword' => 'are',
                'method' => 'ignore case'
            ),
            array(
                'keyword' => 'the',
                'method' => 'ignore case'
            ),
            array(
                'keyword' =>  'basics',
                'method' => 'literal'
            )
        )
    )
);
$lexer->registerRule('case_rule', $case_rule);
$case_rule->applyRuleToContent('The basics are Rules?');

var_export($case_rule->getTokens());
echo "\n";

您可以从终端键入以下内容来运行此示例

php samples/block_sample_01.php

执行此示例后,您可以在您的终端中看到解析的令牌列表

array (
  0 => 'The',
)

请注意,列表中只包含一个条目,因为案例规则只影响列表或规则中的第一个出现。

顺序规则

顺序规则与案例规则类似,但需要查看方法,它必须是'顺序',此外,您可以定义一个分词器表达式,以便在参与顺序的规则之间允许使用分隔符

下面是一个使用顺序规则的基本示例

require_once 'vendor/autoload.php';

use nabu\lexer\CNabuCustomLexer;
use nabu\lexer\data\CNabuLexerData;

use nabu\lexer\rules\CNabuLexerRuleGroup;

$lexer = CNabuCustomLexer::getLexer();
$lexer->setData(new CNabuLexerData());

$sequence_rule = CNabuLexerRuleGroup::createFromDescriptor(
    $lexer,
    array(
        'method' => 'sequence',
        'tokenizer' => array(
            'method' => 'literal',
            'match' => '\s+',
        ),
        'group' => array(
            array(
                'keyword' => 'the',
                'method' => 'ignore case'
            ),
            array(
                'keyword' =>  'basics',
                'method' => 'literal'
            ),
            array(
                'keyword' => 'are',
                'method' => 'ignore case'
            ),
            array(
                'keyword' => 'Rules',
                'method' => 'ignore case'
            )
        )
    )
);
$lexer->registerRule('sequence_rule', $sequence_rule);
$sequence_rule->applyRuleToContent("The basics   are\tRules?");

var_export($sequence_rule->getTokens());
echo "\n";

案例规则的变体有关的是两个因素

  1. 方法是'顺序'。
  2. 我们添加了一个包含显式规则声明(在这种情况下是一个正则表达式规则)的分词器属性。该规则在规则列表中的每次迭代之前应用。

您可以从终端键入以下内容来运行此示例

php samples/block_sample_02.php

执行此示例后,您可以在您的终端中看到解析的令牌列表

array (
  0 => 'The',
  1 => ' ',
  2 => 'basics',
  3 => '   ',
  4 => 'are',
  5 => '	',
  6 => 'Rules',
)

请注意,列表中包含样本字符串中的所有单词,因为顺序规则试图按声明的顺序匹配整个列表。如果某个规则失败,则顺序停止,并将列表重置为NULL以确保不解析任何标记。

重复规则

重复规则能够为规则定义基数。这个基数可以定义为最小值和最大值或固定值。允许的格式可以是

  • 固定基数:任何从0开始的自然数。这将被应用为'恰好重复n次',其中n是选定的数字。
  • 范围:一个范围是一个值元组,形式为'm..n',其中mn是从0开始的自然数,对于m是起始值,对于n是结束值。这意味着'重复m和n次'。如果重复次数小于m,则规则评估失败。如果在强制的m和n次迭代之间重复评估规则失败,则评估规则成功。如果重复迭代达到n,则评估停止并成功完成。
  • 无限:在这种情况下,您可以选择'n'作为值。内部,这被转换为1..n并应用范围基数,如上所述,然后,将应用为'至少一次,但无限次数或规则失败'。像顺序规则一样,这种规则支持使用分词器作为规则每次迭代之间的分隔符。

下面是一个使用重复规则的基本示例

require_once 'vendor/autoload.php';

use nabu\lexer\CNabuCustomLexer;
use nabu\lexer\data\CNabuLexerData;

use nabu\lexer\rules\CNabuLexerRuleRepeat;

$lexer = CNabuCustomLexer::getLexer();
$lexer->setData(new CNabuLexerData());

$repeat_rule = CNabuLexerRuleRepeat::createFromDescriptor(
    $lexer,
    array(
        'repeat' => '1..4',
        'tokenizer' => array(
            'method' => 'literal',
            'match' => '\s+'
        ),
        'rule' => array(
            'method' => 'ignore case',
            'match' => '[a-zA-Z]+'
        )
    )
);
$lexer->registerRule('repeat_rule', $repeat_rule);
$repeat_rule->applyRuleToContent("The basics   are\tRules?");

var_export($repeat_rule->getTokens());
echo "\n";

您可以从终端键入以下内容来运行此示例

php samples/block_sample_03.php

此示例与上述顺序规则的结果类似,但在这个例子中,隐含规则更为宽松,因为规则匹配1到4次之间的任何重复,匹配小写或大写字母的序列。按照这个,包含至少一个单词的另一短语将匹配此规则,直到四个单词的限制。

array (
  0 => 'The',
  1 => ' ',
  2 => 'basics',
  3 => '   ',
  4 => 'are',
  5 => '	',
  6 => 'Rules',
)