private function parseToken(Token $token, Stream $stream, RootNode $root) { $value = $token->getValue(); switch ($token->getType()) { case Token::TEXT: $root->addChild(new PrintNode($value)); break; case Token::TAG_START: try { $node = $this->environment->getTag($value)->parse($this, $stream); if ($node instanceof Node) { $node->addData('line', $token->getLine()); $root->addChild($node); } } catch (\OutOfBoundsException $e) { throw new ParseException("Unknown {$value} tag", $token->getLine(), $e); } break; default: $type = $token->getTypeString(); $line = $token->getLine(); throw new ParseException("Unexpected {$type} ({$value}) token", $line); } return $stream->next(); }
/** * @param $type * @param $value * * @throws Exceptions\SyntaxException * @return Token */ public function expectCurrent($type, $value = null) { if ($this->current->test($type, $value)) { return $this->current; } $value = $this->current->getValue(); $message = "Unexpected {$this->current->getTypeString()}"; if ($value === true) { $message .= ' (true)'; } elseif ($value === false) { $message .= ' (false)'; } elseif ($value !== '') { $message .= " ({$value})"; } throw new SyntaxException($message, $this->current->getLine()); }