alamirault/grammar

该软件包的最新版本(dev-master)没有可用的许可证信息。

dev-master 2019-04-24 12:34 UTC

This package is auto-updated.

Last update: 2024-09-25 07:26:05 UTC


README

此软件包允许您使用 PHP OOP 编写语法。

安装

使用 Composer 安装 PHP 语法解析器

composer require alamirault/grammar

或将软件包添加到您的 composer.json

require: {
    // ...
    "alamirault/grammar": "~1.0" // check packagist.org for more tags
    // ...
}

用法

简单示例

$floatMarker = new OrOperator(
    new Constant(","),
    new Constant(".")
);

$digit = new Pattern("[0-9]");
$digits = new Repeat($digit);

$float = new AndOperator($digits, $floatMarker, $digits);

$grammar = new Grammar('Float', [
    new Definition("Float", $float),
]);

dump($grammar->parse("12.34"));

Alamirault\Grammar\Result {#11
  -value: "12.34"
  -length: 5
  -offset: 0
  -match: true
}

更复杂的示例

$oneSpace = new Constant(' ');
$spaces = new Repeat($oneSpace);

$action = new OrOperator(
    new Constant("ALLOW"),
    new Constant("REFUSE")
);

$if = new Constant("if");

$userType = new Constant("userType");

$userTypeValues = new OrOperator(
    new Constant("WRITER"),
    new Constant("ACTOR")
);

$leftParenthesis = new Constant('(');
$rightParenthesis = new Constant(')');

$comma = new Constant(',');
$arrayElements = new AndOperator(
    new Repeat(
        new OrOperator(
            $spaces,
            new AndOperator($userTypeValues, $comma)
        )
    ),
    $userTypeValues
);


$in = new OrOperator(
    new Constant('in'),
    new Constant('IN')
);

$rule = new AndOperator($action, $spaces, $if, $spaces, $userType, $spaces, $in, $spaces, $leftParenthesis, $arrayElements, $rightParenthesis);

$grammar = new Grammar('Rule1', [
    new Definition("Rule1", $rule),
]);


dump($grammar->parse("ALLOW if userType in (WRITER, ACTOR)")); will return 

Alamirault\Grammar\Result {#26
  -value: "ALLOW if userType in (WRITER, ACTOR)"
  -length: 36
  -offset: 0
  -match: true
}

通过您的自定义类型扩展软件包:列表示例

运行测试套件

./vendor/bin/phpunit

许可证

本项目根据 BSD-3 条款许可证发布。有关完整的版权和许可证信息,请查看与源代码一起分发的 LICENSE 文件。

贡献

如果您想为项目做出贡献并使其变得更好,您的帮助非常受欢迎。