add template for directives

This commit is contained in:
mhoffm
2021-09-17 20:53:40 +02:00
committed by Michael Hoffmann
parent 67a5c19755
commit c0513ba689
1582 changed files with 28118 additions and 16805 deletions

View File

@@ -1179,6 +1179,30 @@
}
]
},
"_template": {
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "template_literal"
},
{
"type": "SYMBOL",
"name": "template_interpolation"
},
{
"type": "SYMBOL",
"name": "template_directive"
}
]
}
}
},
"quoted_template": {
"type": "PREC",
"value": 1,
@@ -1193,20 +1217,8 @@
"type": "CHOICE",
"members": [
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "template_literal"
},
{
"type": "SYMBOL",
"name": "template_interpolation"
}
]
}
"type": "SYMBOL",
"name": "_template"
},
{
"type": "BLANK"
@@ -1235,20 +1247,8 @@
"type": "CHOICE",
"members": [
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "template_literal"
},
{
"type": "SYMBOL",
"name": "template_interpolation"
}
]
}
"type": "SYMBOL",
"name": "_template"
},
{
"type": "BLANK"
@@ -1338,6 +1338,155 @@
}
]
},
"template_directive": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "template_for"
}
]
},
"template_for": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "template_for_start"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_template"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "template_for_end"
}
]
},
"template_for_start": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "template_directive_start"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "strip_marker"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "for"
},
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "identifier"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "in"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "strip_marker"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "template_directive_end"
}
]
},
"template_for_end": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "template_directive_start"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "strip_marker"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "endfor"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "strip_marker"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "template_directive_end"
}
]
},
"comment": {
"type": "TOKEN",
"content": {
@@ -1430,6 +1579,14 @@
"type": "SYMBOL",
"name": "template_interpolation_end"
},
{
"type": "SYMBOL",
"name": "template_directive_start"
},
{
"type": "SYMBOL",
"name": "template_directive_end"
},
{
"type": "SYMBOL",
"name": "heredoc_identifier"

View File

@@ -481,6 +481,10 @@
"type": "heredoc_start",
"named": true
},
{
"type": "template_directive",
"named": true
},
{
"type": "template_interpolation",
"named": true
@@ -657,6 +661,10 @@
"type": "quoted_template_start",
"named": true
},
{
"type": "template_directive",
"named": true
},
{
"type": "template_interpolation",
"named": true
@@ -710,6 +718,21 @@
]
}
},
{
"type": "template_directive",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "template_for",
"named": true
}
]
}
},
{
"type": "template_expr",
"named": true,
@@ -729,6 +752,91 @@
]
}
},
{
"type": "template_for",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "template_directive",
"named": true
},
{
"type": "template_for_end",
"named": true
},
{
"type": "template_for_start",
"named": true
},
{
"type": "template_interpolation",
"named": true
},
{
"type": "template_literal",
"named": true
}
]
}
},
{
"type": "template_for_end",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "strip_marker",
"named": true
},
{
"type": "template_directive_end",
"named": true
},
{
"type": "template_directive_start",
"named": true
}
]
}
},
{
"type": "template_for_start",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "strip_marker",
"named": true
},
{
"type": "template_directive_end",
"named": true
},
{
"type": "template_directive_start",
"named": true
}
]
}
},
{
"type": "template_interpolation",
"named": true,
@@ -980,6 +1088,10 @@
"type": "ellipsis",
"named": true
},
{
"type": "endfor",
"named": false
},
{
"type": "false",
"named": false
@@ -1020,6 +1132,14 @@
"type": "strip_marker",
"named": true
},
{
"type": "template_directive_end",
"named": true
},
{
"type": "template_directive_start",
"named": true
},
{
"type": "template_interpolation_end",
"named": true

30188
src/parser.c

File diff suppressed because it is too large Load Diff

View File

@@ -17,11 +17,14 @@ enum TokenType {
TEMPLATE_LITERAL_CHUNK,
TEMPLATE_INTERPOLATION_START,
TEMPLATE_INTERPOLATION_END,
TEMPLATE_DIRECTIVE_START,
TEMPLATE_DIRECTIVE_END,
HEREDOC_IDENTIFIER,
};
enum ContextType {
TEMPLATE_INTERPOLATION,
TEMPLATE_DIRECTIVE,
QUOTED_TEMPLATE,
HEREDOC_TEMPLATE,
};
@@ -130,6 +133,34 @@ public:
return accept_and_advance(lexer, TEMPLATE_INTERPOLATION_END);
}
// manage template directives
if (
valid_symbols[TEMPLATE_DIRECTIVE_START] &&
valid_symbols[TEMPLATE_LITERAL_CHUNK] &&
!in_directive_context() &&
lexer->lookahead == '%'
) {
advance(lexer);
if (lexer->lookahead == '{') {
Context ctx = { TEMPLATE_DIRECTIVE };
context_stack.push_back(ctx);
return accept_and_advance(lexer, TEMPLATE_DIRECTIVE_START);
}
// try to scan escape sequence
if (lexer->lookahead == '%') {
advance(lexer);
if (lexer->lookahead == '{') {
// $${
return accept_and_advance(lexer, TEMPLATE_LITERAL_CHUNK);
}
}
return accept_inplace(lexer, TEMPLATE_LITERAL_CHUNK);
}
if (valid_symbols[TEMPLATE_DIRECTIVE_END] && in_directive_context() && lexer->lookahead == '}') {
context_stack.pop_back();
return accept_and_advance(lexer, TEMPLATE_DIRECTIVE_END);
}
// manage heredoc context
if (valid_symbols[HEREDOC_IDENTIFIER] && !in_heredoc_context()) {
string identifier;
@@ -255,6 +286,9 @@ private:
return in_context_type(TEMPLATE_INTERPOLATION);
}
bool in_directive_context() {
return in_context_type(TEMPLATE_DIRECTIVE);
}
};
} // namespace