Exemple #1
0
 /**
  * @param Token  $token
  * @param Parser $parser
  * @return Node
  * @throws SyntaxException
  * @throws \Azera\Fry\Exception\Exception
  */
 public function parse(Token $token, Parser $parser)
 {
     $line = $token->getLine();
     $stream = $parser->getStream();
     $stream->expect(TokenTypes::T_SECTION_TYPE, 'if');
     $expr = $parser->parseExpression();
     if ($expr == null) {
         throw new SyntaxException("If statement must have an expression, on line %d column %d", $token->getLine(), $token->getColumn());
     }
     $openToken = $stream->expect(TokenTypes::T_SECTION_OPEN);
     $body = $parser->subparse([$this, $openToken->getValue() == '{' ? 'decideIfBraceEnd' : 'decideIfFork']);
     $else = null;
     $tests = [$expr, $body];
     if ($openToken->getValue() == '{') {
         $stream->expect(TokenTypes::T_SECTION_CLOSE, '}');
     } else {
         $end = false;
         while (!$end) {
             $token = $stream->getToken();
             if (!$stream->isEOF()) {
                 $stream->next();
             }
             switch ($token->getValue()) {
                 case 'else':
                     $stream->expect(TokenTypes::T_SECTION_OPEN);
                     $else = $parser->subparse([$this, 'decideIfEnd']);
                     break;
                 case 'elseif':
                     $expr = $parser->parseExpression();
                     $stream->expect(TokenTypes::T_SECTION_OPEN);
                     $body = $parser->subparse([$this, 'decideIfFork']);
                     $tests[] = $expr;
                     $tests[] = $body;
                     break;
                 case 'endif':
                     $stream->expect(TokenTypes::T_SECTION_OPEN);
                     $end = true;
                     break;
                 default:
                     throw new SyntaxException('Unexpected end of template, if statement end not found');
             }
         }
     }
     return new Node\IfSection($tests, $else, $line);
 }
Exemple #2
0
 /**
  * @param Token  $token
  * @param Parser $parser
  * @return Node
  */
 public function parse(Token $token, Parser $parser)
 {
     $stream = $parser->getStream();
     $stream->expect(TokenTypes::T_SECTION_TYPE, 'set');
     $var = $stream->expect(TokenTypes::T_NAME, null, 'Variable name is empty');
     if ($stream->test(TokenTypes::T_SET)) {
         $stream->expect(TokenTypes::T_SET);
         $exp = $parser->parseExpression();
         $stream->expect(TokenTypes::T_SECTION_OPEN);
         return new Node\SetNode($var->getValue(), $exp, false, $token->getLine());
     } else {
         $stream->expect(TokenTypes::T_SECTION_OPEN, '{');
         $value = $parser->subparse([$this, 'decideIfEnd']);
         $stream->expect(TokenTypes::T_SECTION_CLOSE, '}');
         return new Node\SetNode($var->getValue(), $value, true, $token->getLine());
     }
 }
Exemple #3
0
 /**
  * @param Token  $token
  * @param Parser $parser
  * @return Node
  */
 public function parse(Token $token, Parser $parser)
 {
     $stream = $parser->getStream();
     $stream->expect(TokenTypes::T_SECTION_TYPE, 'for');
     $key = $value = null;
     $value = $stream->expect(TokenTypes::T_NAME, null, 'Loop value variable not defined.');
     if ($stream->test(TokenTypes::T_COMMA)) {
         $stream->expect(TokenTypes::T_COMMA);
         $key = $value;
         $value = $stream->expect(TokenTypes::T_NAME, null, 'Loop value variable not defined.');
     }
     $stream->expect(TokenTypes::T_KEYWORD, 'in');
     $repo = $parser->parseExpression();
     $stream->expect(TokenTypes::T_SECTION_OPEN, '{');
     $body = $parser->subparse([$this, 'decideIfEnd']);
     $stream->expect(TokenTypes::T_SECTION_CLOSE, '}');
     return new Node\LoopNode($key ? $key->getValue() : null, $value->getValue(), $repo, $body, $token->getLine());
 }
 /**
  * @param Parser $parser
  * @return \Azera\Fry\Node
  * @throws \Azera\Fry\Exception\Exception
  */
 public function parseBody(Parser $parser)
 {
     $stream = $parser->getStream();
     $isBrace = false;
     if ($this->endType() == self::END_TYPE_BRACE) {
         $isBrace = !!$stream->expect(TokenTypes::T_SECTION_OPEN, '{');
     } elseif ($this->endType() == self::END_TYPE_BOTH && $stream->test(TokenTypes::T_SECTION_OPEN, '{')) {
         $isBrace = !!$stream->next();
     } else {
         $stream->expect(TokenTypes::T_SECTION_OPEN);
     }
     $body = $parser->subparse([$this, $isBrace ? 'testEndBrace' : 'testEnd']);
     if ($isBrace) {
         $stream->expect(TokenTypes::T_SECTION_CLOSE, '}');
     } else {
         $stream->expect(TokenTypes::T_SECTION_TYPE, $this->getSectionEnd());
         $stream->expect(TokenTypes::T_SECTION_OPEN);
     }
     return $body;
 }
Exemple #5
0
 /**
  * @param Token  $token
  * @param Parser $parser
  * @return Node
  */
 public function parse(Token $token, Parser $parser)
 {
     $line = $token->getLine();
     $stream = $parser->getStream();
     $stream->expect(null, [self::BLOCK_START]);
     $blockName = $stream->expect(TokenTypes::T_NAME, null, 'Missing block name');
     $endDecider = 'decideIfEnd';
     if ($stream->test(TokenTypes::T_SECTION_OPEN, '{')) {
         $endDecider = 'decideIfBraceEnd';
     }
     $stream->expect(TokenTypes::T_SECTION_OPEN);
     $body = $parser->subparse([$this, $endDecider]);
     if ($endDecider == 'decideIfEnd') {
         $stream->expect(TokenTypes::T_SECTION_TYPE, 'endblock');
         $stream->expect(TokenTypes::T_SECTION_OPEN);
     } else {
         $stream->expect(TokenTypes::T_SECTION_CLOSE, '}');
     }
     $parser->setBlock($blockName->getValue(), new Node\Block($body, $blockName->getValue(), $line));
     return new Node\PrintNode(new Node\RenderBlock($blockName->getValue(), new Node\Expression\Arguments(), $line), $line);
 }