1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
<?php
/* * This file is part of Twig. * * (c) Fabien Potencier * (c) Armin Ronacher * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace ElementorDeps\Twig;
use ElementorDeps\Twig\Error\SyntaxError; /** * Represents a token stream. * * @author Fabien Potencier <[email protected]> */ final class TokenStream { private $tokens; private $current = 0; private $source; public function __construct(array $tokens, ?Source $source = null) { $this->tokens = $tokens; $this->source = $source ?: new Source('', ''); } public function __toString() { return \implode("\n", $this->tokens); } public function injectTokens(array $tokens) { $this->tokens = \array_merge(\array_slice($this->tokens, 0, $this->current), $tokens, \array_slice($this->tokens, $this->current)); } /** * Sets the pointer to the next token and returns the old one. */ public function next() : Token { if (!isset($this->tokens[++$this->current])) { throw new SyntaxError('Unexpected end of template.', $this->tokens[$this->current - 1]->getLine(), $this->source); } return $this->tokens[$this->current - 1]; } /** * Tests a token, sets the pointer to the next one and returns it or throws a syntax error. * * @return Token|null The next token if the condition is true, null otherwise */ public function nextIf($primary, $secondary = null) { return $this->tokens[$this->current]->test($primary, $secondary) ? $this->next() : null; } /** * Tests a token and returns it or throws a syntax error. */ public function expect($type, $value = null, ?string $message = null) : Token { $token = $this->tokens[$this->current]; if (!$token->test($type, $value)) { $line = $token->getLine(); throw new SyntaxError(\sprintf('%sUnexpected token "%s"%s ("%s" expected%s).', $message ? $message . '. ' : '', Token::typeToEnglish($token->getType()), $token->getValue() ? \sprintf(' of value "%s"', $token->getValue()) : '', Token::typeToEnglish($type), $value ? \sprintf(' with value "%s"', $value) : ''), $line, $this->source); } $this->next(); return $token; } /** * Looks at the next token. */ public function look(int $number = 1) : Token { if (!isset($this->tokens[$this->current + $number])) { throw new SyntaxError('Unexpected end of template.', $this->tokens[$this->current + $number - 1]->getLine(), $this->source); } return $this->tokens[$this->current + $number]; } /** * Tests the current token. */ public function test($primary, $secondary = null) : bool { return $this->tokens[$this->current]->test($primary, $secondary); } /** * Checks if end of stream was reached. */ public function isEOF() : bool { return -1 === $this->tokens[$this->current]->getType(); } public function getCurrent() : Token { return $this->tokens[$this->current]; } /** * Gets the source associated with this stream. * * @internal */ public function getSourceContext() : Source { return $this->source; } }
|