/** * @param TokenStream $tokenStream * @return Query * @throws SyntaxErrorException */ public function parse(TokenStream $tokenStream) { $queryBuilder = $this->createQueryBuilder(); while (!$tokenStream->isEnd()) { $queryBuilder->addNode($this->tokenParserGroup->parse($tokenStream)); $tokenStream->nextIf(Token::T_AMPERSAND); } return $queryBuilder->getQuery(); }
public function decode($rqlQueryString) { $rqlQueryString = RqlParser::prepare_rql_string($rqlQueryString); $queryTokenParser = new TokenParserGroup(); $queryTokenParser->addTokenParser(new TokenParser\Query\GroupTokenParser($queryTokenParser))->addTokenParser(new TokenParser\Query\Basic\LogicOperator\AndTokenParser($queryTokenParser))->addTokenParser(new TokenParser\Query\Basic\LogicOperator\OrTokenParser($queryTokenParser))->addTokenParser(new TokenParser\Query\Basic\LogicOperator\NotTokenParser($queryTokenParser))->addTokenParser(new TokenParser\Query\Basic\ArrayOperator\InTokenParser())->addTokenParser(new TokenParser\Query\Basic\ArrayOperator\OutTokenParser())->addTokenParser(new TokenParser\Query\Basic\ScalarOperator\EqTokenParser())->addTokenParser(new TokenParser\Query\Basic\ScalarOperator\NeTokenParser())->addTokenParser(new TokenParser\Query\Basic\ScalarOperator\LtTokenParser())->addTokenParser(new TokenParser\Query\Basic\ScalarOperator\GtTokenParser())->addTokenParser(new TokenParser\Query\Basic\ScalarOperator\LeTokenParser())->addTokenParser(new TokenParser\Query\Basic\ScalarOperator\GeTokenParser())->addTokenParser(new TokenParser\Query\Basic\ScalarOperator\LikeTokenParser())->addTokenParser(new TokenParser\Query\Fiql\ArrayOperator\InTokenParser())->addTokenParser(new TokenParser\Query\Fiql\ArrayOperator\OutTokenParser())->addTokenParser(new TokenParser\Query\Fiql\ScalarOperator\EqTokenParser())->addTokenParser(new TokenParser\Query\Fiql\ScalarOperator\NeTokenParser())->addTokenParser(new TokenParser\Query\Fiql\ScalarOperator\LtTokenParser())->addTokenParser(new TokenParser\Query\Fiql\ScalarOperator\GtTokenParser())->addTokenParser(new TokenParser\Query\Fiql\ScalarOperator\LeTokenParser())->addTokenParser(new TokenParser\Query\Fiql\ScalarOperator\GeTokenParser())->addTokenParser(new TokenParser\Query\Fiql\ScalarOperator\LikeTokenParser())->addTokenParser(new Fiql\ScalarOperator\MatchTokenParser())->addTokenParser(new Basic\ScalarOperator\MatchTokenParser()); $parser = (new Parser((new ExpressionParser())->registerTypeCaster('string', new TypeCaster\StringTypeCaster())->registerTypeCaster('integer', new TypeCaster\IntegerTypeCaster())->registerTypeCaster('float', new TypeCaster\FloatTypeCaster())->registerTypeCaster('boolean', new TypeCaster\BooleanTypeCaster())))->addTokenParser(new SelectTokenParser($this->allowedAggregateFunction))->addTokenParser($queryTokenParser)->addTokenParser(new TokenParser\SortTokenParser())->addTokenParser(new TokenParser\LimitTokenParser()); $rqlQueryObject = $parser->parse((new Lexer())->tokenize($rqlQueryString)); return $rqlQueryObject; }
public static function createDefault() { $queryTokenParser = new TokenParserGroup(); $queryTokenParser->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\GroupTokenParser($queryTokenParser))->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Basic\LogicOperator\AndTokenParser($queryTokenParser))->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Basic\LogicOperator\OrTokenParser($queryTokenParser))->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Basic\LogicOperator\NotTokenParser($queryTokenParser))->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Basic\ArrayOperator\InTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Basic\ArrayOperator\OutTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Basic\ScalarOperator\EqTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Basic\ScalarOperator\NeTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Basic\ScalarOperator\LtTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Basic\ScalarOperator\GtTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Basic\ScalarOperator\LeTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Basic\ScalarOperator\GeTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Basic\ScalarOperator\LikeTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Fiql\ArrayOperator\InTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Fiql\ArrayOperator\OutTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Fiql\ScalarOperator\EqTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Fiql\ScalarOperator\NeTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Fiql\ScalarOperator\LtTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Fiql\ScalarOperator\GtTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Fiql\ScalarOperator\LeTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Fiql\ScalarOperator\GeTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\Query\Fiql\ScalarOperator\LikeTokenParser()); return (new self((new FixRqlExpressionParser())->registerTypeCaster('string', new \Xiag\Rql\Parser\TypeCaster\StringTypeCaster())->registerTypeCaster('integer', new \Xiag\Rql\Parser\TypeCaster\IntegerTypeCaster())->registerTypeCaster('float', new \Xiag\Rql\Parser\TypeCaster\FloatTypeCaster())->registerTypeCaster('boolean', new \Xiag\Rql\Parser\TypeCaster\BooleanTypeCaster())))->addTokenParser(new \Xiag\Rql\Parser\TokenParser\SelectTokenParser())->addTokenParser($queryTokenParser)->addTokenParser(new \Xiag\Rql\Parser\TokenParser\SortTokenParser())->addTokenParser(new \Xiag\Rql\Parser\TokenParser\LimitTokenParser()); }
<?php namespace Xiag\Rql\ParserExample01; use Xiag\Rql\Parser\Lexer; use Xiag\Rql\Parser\Parser; use Xiag\Rql\Parser\ExpressionParser; use Xiag\Rql\Parser\TokenParserGroup; use Xiag\Rql\Parser\TokenParser\Query\GroupTokenParser; use Xiag\Rql\Parser\TokenParser\Query\Fiql; require __DIR__ . '/../vendor/autoload.php'; $queryTokenParser = new TokenParserGroup(); $queryTokenParser->addTokenParser(new GroupTokenParser($queryTokenParser))->addTokenParser(new Fiql\ArrayOperator\InTokenParser())->addTokenParser(new Fiql\ArrayOperator\OutTokenParser())->addTokenParser(new Fiql\ScalarOperator\EqTokenParser())->addTokenParser(new Fiql\ScalarOperator\NeTokenParser())->addTokenParser(new Fiql\ScalarOperator\LtTokenParser())->addTokenParser(new Fiql\ScalarOperator\GtTokenParser())->addTokenParser(new Fiql\ScalarOperator\LeTokenParser())->addTokenParser(new Fiql\ScalarOperator\GeTokenParser()); $parser = new Parser(new ExpressionParser()); $parser->addTokenParser($queryTokenParser); $lexer = new Lexer(); // ok $tokenStream = $lexer->tokenize('((a==true|b!=str)&c>=10&d=in=(1,value,null))'); var_dump($parser->parse($tokenStream)); // error $tokenStream = $lexer->tokenize('or(eq(a,true),ne(b,str))>e(c,10)&in(d,(1,value,null))'); var_dump($parser->parse($tokenStream));