getsky/royal-stag

dev-develop / 0.9.1.x-dev 2021-10-27 11:36 UTC

This package is not auto-updated.

Last update: 2024-09-27 00:34:23 UTC


README

Build Status Scrutinizer Code Quality Code Coverage

RoyalStag是一个PHP库,用于解析文本,实现了解析表达式语法的优势,即PEG。其主要特点是语法直接设置在PHP代码中。这意味着您不需要学习任何第三方格式即可开始使用此库,并且不会失去您喜欢的IDE(语法高亮、重构等)提供的功能。

轻松集成到您的项目中

要将库集成到您的项目中,您无需花费大量时间和精力。该库的开放和灵活架构可以轻松集成到任何架构解决方案中,因为它不需要第三方工具生成解析器。您只需在composer.json中添加一行即可。

"getsky/royal-stag": "0.9.1@dev"

为什么不是正则表达式?

在许多情况下,它也缺乏解析文本的能力,例如需要递归定义规则的内嵌设计。它们也不提供适当的错误消息,这可以在开发和软件支持过程中节省大量时间。当然,易于学习也是一个优势。

为什么不是ANTLR和其他企业级解决方案?

ANTLR和其他类似库可能包含RoyalStag甚至更多的功能,但并非总是适合使用这样的大型库。这些库需要更多的时间来学习、与它们一起开发以及持续支持软件产品。

简单示例

以下示例展示了工作原理

<?php

use GetSky\ParserExpressions\Rules\FirstOf;
use GetSky\ParserExpressions\Rules\Optional;
use GetSky\ParserExpressions\Rules\Sequence;
use GetSky\ParserExpressions\Runner;
use GetSky\ParserExpressions\Context;
use GetSky\ParserExpressions\Error;

require_once '../vendor/autoload.php';

$rule = new Sequence([new FirstOf(['Hello', 'Hi']), new Optional(' '), 'world']);
$runner = new Runner($rule);

$result = $runner->run('Hi world!');

$tree = $result->toArray();

变量包含

Array
(
    [name] => Sequence
    [value] => Hi world
    [start] => 0
    [end] => 8
    [children] => Array
        (
            [0] => Array
                (
                    [name] => FirstOf
                    [value] => Hi
                    [start] => 0
                    [end] => 2
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [name] => Row
                                    [value] => Hi
                                    [start] => 0
                                    [end] => 2
                                )

                        )

                )

            [1] => Array
                (
                    [name] => Optional
                    [value] =>
                    [start] => 2
                    [end] => 3
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [name] => Row
                                    [value] =>
                                    [start] => 2
                                    [end] => 3
                                )

                        )

                )

            [2] => Array
                (
                    [name] => Row
                    [value] => world
                    [start] => 3
                    [end] => 8
                )

        )

)

更多示例

请在此文件夹中查看更多示例。