This commit is contained in:
mhoffm
2021-06-23 00:37:31 +02:00
parent 91e946d55b
commit 9761b958e1

View File

@@ -86,7 +86,30 @@ public:
return accept_and_advance(lexer, TEMPLATE_INTERPOLATION_END); return accept_and_advance(lexer, TEMPLATE_INTERPOLATION_END);
} }
// handle template literal chunks // manage heredoc context
if (valid_symbols[HEREDOC_IDENTIFIER] && !in_heredoc_context()) {
string identifier;
while (iswalnum(lexer->lookahead) || lexer->lookahead == '_' || lexer->lookahead == '-') {
identifier.push_back(lexer->lookahead);
advance(lexer);
}
context_stack.push_back({ .type = HEREDOC_TEMPLATE, .heredoc_identifier = identifier });
return accept_and_advance(lexer, HEREDOC_IDENTIFIER);
}
if (valid_symbols[HEREDOC_IDENTIFIER] && in_heredoc_context()) {
string expected_identifier = context_stack.back().heredoc_identifier;
for (string::iterator it = expected_identifier.begin(); it != expected_identifier.end(); ++it) {
if (lexer->lookahead == *it) {
advance(lexer);
} else {
return accept_and_advance(lexer, TEMPLATE_LITERAL_CHUNK);
}
}
context_stack.pop_back();
return accept_and_advance(lexer, HEREDOC_IDENTIFIER);
}
// manage template literal chunks
// handle template literal chunks in quoted contexts // handle template literal chunks in quoted contexts
// //
@@ -140,30 +163,6 @@ public:
} }
} }
// handle heredoc context
if (valid_symbols[HEREDOC_IDENTIFIER] && !in_heredoc_context()) {
string identifier;
while (iswalnum(lexer->lookahead) || lexer->lookahead == '_' || lexer->lookahead == '-') {
identifier.push_back(lexer->lookahead);
advance(lexer);
}
context_stack.push_back({ .type = HEREDOC_TEMPLATE, .heredoc_identifier = identifier });
return accept_and_advance(lexer, HEREDOC_IDENTIFIER);
}
if (valid_symbols[HEREDOC_IDENTIFIER] && in_heredoc_context()) {
string expected_identifier = context_stack.back().heredoc_identifier;
for (string::iterator it = expected_identifier.begin(); it != expected_identifier.end(); ++it) {
if (lexer->lookahead == *it) {
advance(lexer);
} else {
return accept_and_advance(lexer, TEMPLATE_LITERAL_CHUNK);
}
}
context_stack.pop_back();
return accept_and_advance(lexer, HEREDOC_IDENTIFIER);
}
// handle all other quoted template or string literal characters // handle all other quoted template or string literal characters
if (valid_symbols[TEMPLATE_LITERAL_CHUNK] && in_template_context()) { if (valid_symbols[TEMPLATE_LITERAL_CHUNK] && in_template_context()) {
return accept_and_advance(lexer, TEMPLATE_LITERAL_CHUNK); return accept_and_advance(lexer, TEMPLATE_LITERAL_CHUNK);