1
0

Add string interpolation

This commit is contained in:
Jip J. Dekker 2021-01-11 16:05:44 +11:00
parent b1cfdb1088
commit 32c7271384
5 changed files with 4953 additions and 4302 deletions

View File

@ -187,3 +187,18 @@ multiple = { i | i in X, j in Y where i == j};
(assignment (identifier) (set_comprehension (identifier) (generator (identifier) (identifier)))) (assignment (identifier) (set_comprehension (identifier) (generator (identifier) (identifier))))
(assignment (identifier) (set_comprehension (identifier) (generator (identifier) (identifier) (infix_operator (identifier) (integer_literal))))) (assignment (identifier) (set_comprehension (identifier) (generator (identifier) (identifier) (infix_operator (identifier) (integer_literal)))))
(assignment (identifier) (set_comprehension (identifier) (generator (identifier) (identifier)) (generator (identifier) (identifier) (infix_operator (identifier) (identifier)))))) (assignment (identifier) (set_comprehension (identifier) (generator (identifier) (identifier)) (generator (identifier) (identifier) (infix_operator (identifier) (identifier))))))
====================
String Interpolation
====================
simple = "\(x)";
with_text = "the \(i)th variable";
multiple = "\(x) and \(y)";
---
(source_file
(assignment (identifier) (string_interpolation (identifier)))
(assignment (identifier) (string_interpolation (string_content) (identifier) (string_content)))
(assignment (identifier) (string_interpolation (identifier) (string_content) (identifier))))

View File

@ -55,6 +55,7 @@ module.exports = grammar({
$.infix_operator, $.infix_operator,
$.prefix_operator, $.prefix_operator,
$.set_comprehension, $.set_comprehension,
$.string_interpolation,
// TODO: Other expression types // TODO: Other expression types
seq('(', $._expression, ')'), seq('(', $._expression, ')'),
), ),
@ -136,6 +137,11 @@ module.exports = grammar({
'{', $._expression, '|', sepBy1(',', $.generator), '}', '{', $._expression, '|', sepBy1(',', $.generator), '}',
), ),
// TODO: Decide if string_literal and string_interpolation should be combined
string_interpolation: $ => seq(
'"', optional($.string_content), repeat1(seq('\\(', $._expression, ')', optional($.string_content))), '"',
),
_literal: $ => choice( _literal: $ => choice(
$.absent, $.absent,
$.array_literal, $.array_literal,
@ -162,14 +168,11 @@ module.exports = grammar({
)), )),
set_literal: $ => seq('{', sepBy(',', $._expression), '}'), set_literal: $ => seq('{', sepBy(',', $._expression), '}'),
string_literal: $ => seq( string_literal: $ => seq('"', alias(optional($.string_content), 'content'), '"'),
'"', string_content: $ => repeat1(choice(
repeat(choice(
token.immediate(prec(1, /[^"\n\\]+/)), token.immediate(prec(1, /[^"\n\\]+/)),
$.escape_sequence $.escape_sequence
)), )),
'"'
),
escape_sequence: $ => token.immediate(seq( escape_sequence: $ => token.immediate(seq(
'\\', '\\',
choice( choice(

92
src/grammar.json vendored
View File

@ -117,6 +117,10 @@
"type": "SYMBOL", "type": "SYMBOL",
"name": "set_comprehension" "name": "set_comprehension"
}, },
{
"type": "SYMBOL",
"name": "string_interpolation"
},
{ {
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
@ -1172,6 +1176,63 @@
} }
] ]
}, },
"string_interpolation": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "\""
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "string_content"
},
{
"type": "BLANK"
}
]
},
{
"type": "REPEAT1",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "\\("
},
{
"type": "SYMBOL",
"name": "_expression"
},
{
"type": "STRING",
"value": ")"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "string_content"
},
{
"type": "BLANK"
}
]
}
]
}
},
{
"type": "STRING",
"value": "\""
}
]
},
"_literal": { "_literal": {
"type": "CHOICE", "type": "CHOICE",
"members": [ "members": [
@ -1362,7 +1423,30 @@
"value": "\"" "value": "\""
}, },
{ {
"type": "REPEAT", "type": "ALIAS",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "string_content"
},
{
"type": "BLANK"
}
]
},
"named": false,
"value": "content"
},
{
"type": "STRING",
"value": "\""
}
]
},
"string_content": {
"type": "REPEAT1",
"content": { "content": {
"type": "CHOICE", "type": "CHOICE",
"members": [ "members": [
@ -1384,12 +1468,6 @@
] ]
} }
}, },
{
"type": "STRING",
"value": "\""
}
]
},
"escape_sequence": { "escape_sequence": {
"type": "IMMEDIATE_TOKEN", "type": "IMMEDIATE_TOKEN",
"content": { "content": {

165
src/node-types.json vendored
View File

@ -71,6 +71,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -146,6 +150,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -229,6 +237,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -332,6 +344,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -350,6 +366,21 @@
} }
} }
}, },
{
"type": "content",
"named": false,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "escape_sequence",
"named": true
}
]
}
},
{ {
"type": "generator", "type": "generator",
"named": true, "named": true,
@ -418,6 +449,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -525,6 +560,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -601,6 +640,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -684,6 +727,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -766,6 +813,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -850,6 +901,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -1054,6 +1109,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -1149,6 +1208,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -1228,6 +1291,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -1303,6 +1370,10 @@
"type": "set_literal", "type": "set_literal",
"named": true "named": true
}, },
{
"type": "string_interpolation",
"named": true
},
{ {
"type": "string_literal", "type": "string_literal",
"named": true "named": true
@ -1326,7 +1397,7 @@
} }
}, },
{ {
"type": "string_literal", "type": "string_content",
"named": true, "named": true,
"fields": {}, "fields": {},
"children": { "children": {
@ -1340,6 +1411,94 @@
] ]
} }
}, },
{
"type": "string_interpolation",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "absent",
"named": true
},
{
"type": "array_comprehension",
"named": true
},
{
"type": "array_literal",
"named": true
},
{
"type": "boolean_literal",
"named": true
},
{
"type": "call",
"named": true
},
{
"type": "float_literal",
"named": true
},
{
"type": "generator_call",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "if_then_else",
"named": true
},
{
"type": "indexed_access",
"named": true
},
{
"type": "infix_operator",
"named": true
},
{
"type": "integer_literal",
"named": true
},
{
"type": "prefix_operator",
"named": true
},
{
"type": "set_comprehension",
"named": true
},
{
"type": "set_literal",
"named": true
},
{
"type": "string_content",
"named": true
},
{
"type": "string_interpolation",
"named": true
},
{
"type": "string_literal",
"named": true
}
]
}
},
{
"type": "string_literal",
"named": true,
"fields": {}
},
{ {
"type": "!=", "type": "!=",
"named": false "named": false
@ -1436,6 +1595,10 @@
"type": "[", "type": "[",
"named": false "named": false
}, },
{
"type": "\\(",
"named": false
},
{ {
"type": "\\/", "type": "\\/",
"named": false "named": false

8952
src/parser.c vendored

File diff suppressed because it is too large Load Diff