Skip to content

Commit

Permalink
added Grammar and SimpleTokenParser
Browse files Browse the repository at this point in the history
  • Loading branch information
fabpot committed Jan 3, 2011
1 parent ad80ac8 commit 9c3da6d
Show file tree
Hide file tree
Showing 26 changed files with 939 additions and 0 deletions.
30 changes: 30 additions & 0 deletions lib/Twig/Extensions/Grammar.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

/*
* This file is part of Twig.
*
* (c) 2010 Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
abstract class Twig_Extensions_Grammar implements Twig_Extensions_GrammarInterface
{
protected $name;
protected $parser;

public function __construct($name)
{
$this->name = $name;
}

public function setParser(Twig_ParserInterface $parser)
{
$this->parser = $parser;
}

public function getName()
{
return $this->name;
}
}
22 changes: 22 additions & 0 deletions lib/Twig/Extensions/Grammar/Arguments.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

/*
* This file is part of Twig.
*
* (c) 2010 Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
class Twig_Extensions_Grammar_Arguments extends Twig_Extensions_Grammar
{
public function __toString()
{
return sprintf('<%s:arguments>', $this->name);
}

public function parse(Twig_Token $token)
{
return $this->parser->getExpressionParser()->parseArguments();
}
}
22 changes: 22 additions & 0 deletions lib/Twig/Extensions/Grammar/Array.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

/*
* This file is part of Twig.
*
* (c) 2010 Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
class Twig_Extensions_Grammar_Array extends Twig_Extensions_Grammar
{
public function __toString()
{
return sprintf('<%s:array>', $this->name);
}

public function parse(Twig_Token $token)
{
return $this->parser->getExpressionParser()->parseArrayExpression();
}
}
39 changes: 39 additions & 0 deletions lib/Twig/Extensions/Grammar/Body.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

/*
* This file is part of Twig.
*
* (c) 2010 Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
class Twig_Extensions_Grammar_Body extends Twig_Extensions_Grammar
{
protected $end;

public function __construct($name, $end = null)
{
parent::__construct($name);

$this->end = null === $end ? 'end'.$name : $end;
}

public function __toString()
{
return sprintf('<%s:body>', $this->name);
}

public function parse(Twig_Token $token)
{
$stream = $this->parser->getStream();
$stream->expect(Twig_Token::BLOCK_END_TYPE);

return $this->parser->subparse(array($this, 'decideBlockEnd'), true);
}

public function decideBlockEnd($token)
{
return $token->test($this->end);
}
}
24 changes: 24 additions & 0 deletions lib/Twig/Extensions/Grammar/Boolean.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

/*
* This file is part of Twig.
*
* (c) 2010 Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
class Twig_Extensions_Grammar_Boolean extends Twig_Extensions_Grammar
{
public function __toString()
{
return sprintf('<%s:boolean>', $this->name);
}

public function parse(Twig_Token $token)
{
$this->parser->getStream()->expect(Twig_Token::NAME_TYPE, array('true', 'false'));

return new Twig_Node_Expression_Constant('true' === $token->getValue() ? true : false, $token->getLine());
}
}
37 changes: 37 additions & 0 deletions lib/Twig/Extensions/Grammar/Constant.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

/*
* This file is part of Twig.
*
* (c) 2010 Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
class Twig_Extensions_Grammar_Constant extends Twig_Extensions_Grammar
{
protected $type;

public function __construct($name, $type = null)
{
$this->name = $name;
$this->type = null === $type ? Twig_Token::NAME_TYPE : $type;
}

public function __toString()
{
return $this->name;
}

public function parse(Twig_Token $token)
{
$this->parser->getStream()->expect($this->type, $this->name);

return $this->name;
}

public function getType()
{
return $this->type;
}
}
22 changes: 22 additions & 0 deletions lib/Twig/Extensions/Grammar/Expression.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

/*
* This file is part of Twig.
*
* (c) 2010 Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
class Twig_Extensions_Grammar_Expression extends Twig_Extensions_Grammar
{
public function __toString()
{
return sprintf('<%s>', $this->name);
}

public function parse(Twig_Token $token)
{
return $this->parser->getExpressionParser()->parseExpression();
}
}
22 changes: 22 additions & 0 deletions lib/Twig/Extensions/Grammar/Hash.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

/*
* This file is part of Twig.
*
* (c) 2010 Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
class Twig_Extensions_Grammar_Hash extends Twig_Extensions_Grammar
{
public function __toString()
{
return sprintf('<%s:hash>', $this->name);
}

public function parse(Twig_Token $token)
{
return $this->parser->getExpressionParser()->parseHashExpression();
}
}
24 changes: 24 additions & 0 deletions lib/Twig/Extensions/Grammar/Number.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

/*
* This file is part of Twig.
*
* (c) 2010 Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
class Twig_Extensions_Grammar_Number extends Twig_Extensions_Grammar
{
public function __toString()
{
return sprintf('<%s:number>', $this->name);
}

public function parse(Twig_Token $token)
{
$this->parser->getStream()->expect(Twig_Token::NUMBER_TYPE);

return new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
}
}
69 changes: 69 additions & 0 deletions lib/Twig/Extensions/Grammar/Optional.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php

/*
* This file is part of Twig.
*
* (c) 2010 Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
class Twig_Extensions_Grammar_Optional extends Twig_Extensions_Grammar
{
protected $grammar;

public function __construct()
{
$this->grammar = array();
foreach (func_get_args() as $grammar) {
$this->addGrammar($grammar);
}
}

public function __toString()
{
$repr = array();
foreach ($this->grammar as $grammar) {
$repr[] = (string) $grammar;
}

return sprintf('[%s]', implode(' ', $repr));
}

public function addGrammar(Twig_Extensions_GrammarInterface $grammar)
{
$this->grammar[] = $grammar;
}

public function parse(Twig_Token $token)
{
// test if we have the optional element before consuming it
if ($this->grammar[0] instanceof Twig_Extensions_Grammar_Constant) {
if (!$this->parser->getStream()->test($this->grammar[0]->getType(), $this->grammar[0]->getName())) {
return array();
}
} elseif ($this->grammar[0] instanceof Twig_Extensions_Grammar_Name) {
if (!$this->parser->getStream()->test(Twig_Token::NAME_TYPE)) {
return array();
}
} elseif ($this->parser->getStream()->test(Twig_Token::BLOCK_END_TYPE)) {
// if this is not a Constant or a Name, it must be the last element of the tag

return array();
}

$elements = array();
foreach ($this->grammar as $grammar) {
$grammar->setParser($this->parser);

$element = $grammar->parse($token);
if (is_array($element)) {
$elements = array_merge($elements, $element);
} else {
$elements[$grammar->getName()] = $element;
}
}

return $elements;
}
}
24 changes: 24 additions & 0 deletions lib/Twig/Extensions/Grammar/Switch.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

/*
* This file is part of Twig.
*
* (c) 2010 Fabien Potencier
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
class Twig_Extensions_Grammar_Switch extends Twig_Extensions_Grammar
{
public function __toString()
{
return sprintf('<%s:switch>', $this->name);
}

public function parse(Twig_Token $token)
{
$this->parser->getStream()->expect(Twig_Token::NAME_TYPE, $this->name);

return new Twig_Node_Expression_Constant(true, $token->getLine());
}
}
Loading

0 comments on commit 9c3da6d

Please sign in to comment.