webapper / parzrkit
1.0.0-a
2016-04-24 00:29 UTC
Requires
- php: >=5.3.0
- ext-json: *
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)(语言只有匈牙利语,抱歉)
ParzRKit 由 Assarte D'Raven 贡献,并受 Creative Commons Attribution 4.0 国际许可协议 许可。
如何帮助我
请随意使用我的库,希望您能从中受益,提高工作效率。如果您觉得我的帮助对您的工作有帮助,请通过 PayPal 向我捐赠一些积分。
...或者给我一些正面的反馈,您可以在我的个人资料中看到我的电子邮件地址。
无论如何,谢谢!
如何使用
基本上,使用此库的方法非常简单
- 创建一个扩展 ParzRKit 的 Lexer 类,并创建其 Node 类
- 创建 Linker 类(可能多个),它们扩展 ParzRKit 的 Linker - 请记住,您的 Linker 类必须满足您的 Node 类的需求!
- 几乎只需要执行 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"