switch ($name) { case 'parent':
$this->
parseArguments();
if (!\
count($this->parser->
getBlockStack())) { throw new SyntaxError('Calling "parent" outside a block is forbidden.',
$line,
$this->parser->
getStream()->
getSourceContext());
} if (!
$this->parser->
getParent() && !
$this->parser->
hasTraits()) { throw new SyntaxError('Calling "parent" on a template that does not extend nor "use" another template is forbidden.',
$line,
$this->parser->
getStream()->
getSourceContext());
} return new ParentExpression($this->parser->
peekBlockStack(),
$line);
case 'block':
$args =
$this->
parseArguments();
if (\
count($args) < 1
) { throw new SyntaxError('The "block" function takes one argument (the block name).',
$line,
$this->parser->
getStream()->
getSourceContext());
} return new BlockReferenceExpression($args->
getNode(0
), \
count($args) > 1 ?
$args->
getNode(1
) : null,
$line);
case 'attribute':
$args =
$this->
parseArguments();
if (\
count($args) < 2
) { throw new SyntaxError('The "attribute" function takes at least two arguments (the variable and the attributes).',
$line,
$this->parser->
getStream()->
getSourceContext());
}