public function parse(Parser $parser, Stream $stream) { $node = new TagNode($this); $loopVar = $this->parseVariableNode($stream); if ($stream->nextTokenIf(Token::PUNCTUATION, [':', '=>'])) { $node->addChild($loopVar, 'loop_key'); $loopVar = $this->parseVariableNode($stream); } $node->addChild($loopVar, 'loop_variable_0'); $i = 1; while ($stream->nextTokenIf(Token::PUNCTUATION, ',')) { $node->addChild($this->parseVariableNode($stream), 'loop_variable_' . $i++); } $node->addData('variables', $i); $stream->expect(Token::OPERATOR, 'in'); $node->addChild($parser->parseExpression($stream), 'source'); $node->addChild($parser->parseBlock($stream, ['else', 'endfor']), 'loop_body'); if ($stream->next()->test(Token::TAG_END, 'else')) { $node->addChild($parser->parseBlock($stream, 'endfor'), 'else'); $stream->expect(Token::TAG_END); } return $node; }