webapper / parzrkit

ParzRKit

1.0.0-a 2016-04-24 00:29 UTC

This package is not auto-updated.

Last update: 2024-09-25 13:24:27 UTC


README

ParzRKit 是一个用于未来目的的 PHP 抽象解析器库。

这是轻量级框架 Prometheus 的一部分:[Prometheus](http://webapper.vallalatiszolgaltatasok.hu/#!/prometheus)(语言只有匈牙利语,抱歉)

Creative Commons License
ParzRKitAssarte D'Raven 贡献,并受 Creative Commons Attribution 4.0 国际许可协议 许可。

如何帮助我

请随意使用我的库,希望您能从中受益,提高工作效率。如果您觉得我的帮助对您的工作有帮助,请通过 PayPal 向我捐赠一些积分。

PayPal - The safer, easier way to pay online!

...或者给我一些正面的反馈,您可以在我的个人资料中看到我的电子邮件地址。

无论如何,谢谢!

如何使用

基本上,使用此库的方法非常简单

  1. 创建一个扩展 ParzRKit 的 Lexer 类,并创建其 Node 类
  2. 创建 Linker 类(可能多个),它们扩展 ParzRKit 的 Linker - 请记住,您的 Linker 类必须满足您的 Node 类的需求!
  3. 几乎只需要执行 Parser->parse()->compile()->link(); 我说的是:几乎

这是一个使用示例

use ParzRKit\Parser\Lexer\AbstractToken;
use ParzRKit\Parser\Lexer;
use ParzRKit\Linker;
use ParzRKit\Parser;
use ParzRKit\Compiler;
use ParzRKit\Parser\Lexer\DataStreamToken;

define('SRC', realpath(dirname(dirname(__FILE__))).'/src/vendor/assarte/parzrkit/lib/');

require SRC.'Parser/Lexer/AbstractToken.php';
require SRC.'Parser/Lexer/ComposedToken.php';
require SRC.'Parser/Lexer/DataStreamToken.php';
require SRC.'Parser/ReturnToParentException.php';
require SRC.'Parser/Lexer.php';
require SRC.'Parser.php';
require SRC.'Linker.php';
require SRC.'Compiler/CompileException.php';
require SRC.'Compiler/Exception/NotAllowedException.php';
require SRC.'Compiler/Exception/NotMetException.php';
require SRC.'Compiler/BasicNode.php';
require SRC.'Compiler/StrictNode.php';
require SRC.'Compiler/RecursiveNodeIterator.php';
require SRC.'Compiler.php';

class TestToken extends DataStreamToken
{
	public function isDataStream()
	{
		return false;
	}
	
	public function identifyOpenTag()
	{
		if ($this->stream{0} == '/') {
			$this->openTag = '/';
		}
	}
}

class TestSubToken extends AbstractToken
{
	public function identifyOpenTag()
	{
		if ($this->stream{0} == '[') {
			$this->openTag = '[';
		}
	}

	public function identifyCloseTag($inStream=null)
	{
		$pos = $this->getCursor();
		if ($inStream !== null) {
			$pos = 0;
		} else {
			$inStream = $this->processed;
		}
		
		if ($inStream{$pos} == ']') {
			$this->closeTag = ']';
			return true;
		}

		return false;
	}

	public function guessCloseTag()
	{
		return ']';
	}
}

class TestLexer extends Lexer
{
	protected function registerTokeners()
	{
		$this->addTokener('TestToken');
		$this->addTokener('TestSubToken');
	}
}

class TestLinker extends Linker
{
	public function link()
	{
		$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($this));
		foreach ($it as $link) {
			echo str_repeat('| ', $it->getDepth() - 1).'|-'.json_encode($link).'<br>';
		}
	}
}

$stream = '[876/t687][aa[bb[dd]]cc]';
$parser = new Parser($stream, TestLexer::getLexer());
$parser->parse();
$compiler = new Compiler(new TestLinker(), $parser->getToken()->getNode());
$compiler->compile();
echo $stream.'<br>';
$compiler->getLinker()->link();

上述示例将打印

[876/t687][aa[bb[dd]]cc]
|-"[876\/t687]"
| |-"876"
| |-"\/t687"
|-"[aa[bb[dd]]cc]"
| |-"aa"
| |-"[bb[dd]]"
| | |-"bb"
| | |-"[dd]"
| |-"cc"