const STATE_INTERPOLATION = 4;
const REGEX_NAME = '/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A';
- const REGEX_NUMBER = '/[0-9]+(?:\.[0-9]+)?/A';
+ const REGEX_NUMBER = '/\-?[0-9]+(?:\.[0-9]+)?/A';
const REGEX_STRING = '/"([^#"\\\\]*(?:\\\\.[^#"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As';
const REGEX_DQ_STRING_DELIM = '/"/A';
const REGEX_DQ_STRING_PART = '/[^#"\\\\]*(?:(?:\\\\.|#(?!\{))[^#"\\\\]*)*/As';
}
}
+ // numbers
+ if (preg_match(self::REGEX_NUMBER, $this->code, $match, null, $this->cursor)) {
+ $number = (float) $match[0]; // floats
+ if (ctype_digit($match[0]) && $number <= PHP_INT_MAX) {
+ $number = (int) $match[0]; // integers lower than the maximum
+ }
+ $this->pushToken(Twig_Token::NUMBER_TYPE, $number);
+ $this->moveCursor($match[0]);
+ }
// operators
- if (preg_match($this->regexes['operator'], $this->code, $match, null, $this->cursor)) {
+ elseif (preg_match($this->regexes['operator'], $this->code, $match, null, $this->cursor)) {
$this->pushToken(Twig_Token::OPERATOR_TYPE, preg_replace('/\s+/', ' ', $match[0]));
$this->moveCursor($match[0]);
}
$this->pushToken(Twig_Token::NAME_TYPE, $match[0]);
$this->moveCursor($match[0]);
}
- // numbers
- elseif (preg_match(self::REGEX_NUMBER, $this->code, $match, null, $this->cursor)) {
- $number = (float) $match[0]; // floats
- if (ctype_digit($match[0]) && $number <= PHP_INT_MAX) {
- $number = (int) $match[0]; // integers lower than the maximum
- }
- $this->pushToken(Twig_Token::NUMBER_TYPE, $number);
- $this->moveCursor($match[0]);
- }
// punctuation
elseif (false !== strpos(self::PUNCTUATION, $this->code[$this->cursor])) {
// opening bracket
$stream->expect(Twig_Token::OPERATOR_TYPE, 'and');
}
+ public function testNegativeNumbers()
+ {
+ $template = "{{ -3 }}{{ 1 - 2 }}";
+
+ $lexer = new Twig_Lexer(new Twig_Environment());
+ $stream = $lexer->tokenize($template);
+ $stream->expect(Twig_Token::VAR_START_TYPE);
+ $stream->expect(Twig_Token::NUMBER_TYPE, -3);
+ $stream->expect(Twig_Token::VAR_END_TYPE);
+
+ $stream->expect(Twig_Token::VAR_START_TYPE);
+ $stream->expect(Twig_Token::NUMBER_TYPE, 1);
+ $stream->expect(Twig_Token::OPERATOR_TYPE, '-');
+ $stream->expect(Twig_Token::NUMBER_TYPE, 2);
+ $stream->expect(Twig_Token::VAR_END_TYPE);
+ }
+
/**
* @expectedException Twig_Error_Syntax
* @expectedExceptionMessage Unclosed "variable" at line 3