Skip to content

Commit 5819eb7

Browse files
committed
TASK: Fancier string tokenizing
1 parent 8792dc9 commit 5819eb7

1 file changed

Lines changed: 41 additions & 40 deletions

File tree

src/Parser/Tokenizer/Tokenizer.php

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -127,25 +127,26 @@ private static function string(\Iterator $fragments): \Iterator
127127
$fragments->next();
128128

129129
$buffer = Buffer::empty();
130-
$escape = false;
131130

132131
while ($fragments->valid()) {
133-
/** @var Fragment $fragment */
134-
$fragment = $fragments->current();
132+
switch ($fragments->current()->value) {
133+
case $delimiter:
134+
yield from $buffer->flush(TokenType::STRING_QUOTED);
135+
$fragments->next();
136+
return;
135137

136-
if (!$escape && $fragment->value === $delimiter) {
137-
yield from $buffer->flush(TokenType::STRING_QUOTED);
138-
$fragments->next();
139-
return;
140-
}
138+
case '\\':
139+
$buffer->append($fragments->current());
140+
$fragments->next();
141141

142-
$escape = $fragment->value === '\\';
142+
$buffer->append($fragments->current());
143+
$fragments->next();
144+
break;
143145

144-
if (!$escape) {
145-
$buffer->append($fragment);
146+
default:
147+
$buffer->append($fragments->current());
148+
$fragments->next();
146149
}
147-
148-
$fragments->next();
149150
}
150151
}
151152

@@ -162,40 +163,40 @@ public static function templateLiteral(\Iterator $fragments): \Iterator
162163

163164
$fragments->next();
164165

165-
$escape = false;
166-
167166
while ($fragments->valid()) {
168-
/** @var Fragment $fragment */
169-
$fragment = $fragments->current();
170167

171-
if (!$escape && $fragment->value === '`') {
172-
yield from $buffer->flush(TokenType::STRING_QUOTED);
173-
$buffer->append($fragments->current());
174-
yield from $buffer->flush(TokenType::TEMPLATE_LITERAL_END);
175-
$fragments->next();
176-
return;
177-
}
168+
switch ($fragments->current()->value) {
169+
case '`':
170+
yield from $buffer->flush(TokenType::STRING_QUOTED);
171+
$buffer->append($fragments->current());
172+
yield from $buffer->flush(TokenType::TEMPLATE_LITERAL_END);
173+
$fragments->next();
174+
return;
178175

179-
if (!$escape && $fragment->value === '$') {
180-
$dollarSignBuffer = Buffer::empty()->append($fragments->current());
181-
$fragments->next();
182-
$nextFragment = $fragments->current();
176+
case '$':
177+
$dollarSignBuffer = Buffer::empty()->append($fragments->current());
178+
$fragments->next();
179+
$nextFragment = $fragments->current();
183180

184-
if ($nextFragment->value === '{') {
185-
yield from $buffer->flush(TokenType::STRING_QUOTED);
186-
yield from $dollarSignBuffer->flush(TokenType::DOLLAR);
187-
yield from self::block($fragments);
188-
continue;
189-
}
190-
}
181+
if ($nextFragment->value === '{') {
182+
yield from $buffer->flush(TokenType::STRING_QUOTED);
183+
yield from $dollarSignBuffer->flush(TokenType::DOLLAR);
184+
yield from self::block($fragments);
185+
}
186+
break;
191187

192-
$escape = $fragment->value === '\\';
188+
case '\\':
189+
$buffer->append($fragments->current());
190+
$fragments->next();
193191

194-
if (!$escape) {
195-
$buffer->append($fragment);
196-
}
192+
$buffer->append($fragments->current());
193+
$fragments->next();
194+
break;
197195

198-
$fragments->next();
196+
default:
197+
$buffer->append($fragments->current());
198+
$fragments->next();
199+
}
199200
}
200201
}
201202

0 commit comments

Comments
 (0)