Add string interpolation
This commit is contained in:
parent
b1cfdb1088
commit
32c7271384
@ -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) (infix_operator (identifier) (integer_literal)))))
|
||||
(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))))
|
||||
|
19
grammar.js
19
grammar.js
@ -55,6 +55,7 @@ module.exports = grammar({
|
||||
$.infix_operator,
|
||||
$.prefix_operator,
|
||||
$.set_comprehension,
|
||||
$.string_interpolation,
|
||||
// TODO: Other expression types
|
||||
seq('(', $._expression, ')'),
|
||||
),
|
||||
@ -136,6 +137,11 @@ module.exports = grammar({
|
||||
'{', $._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(
|
||||
$.absent,
|
||||
$.array_literal,
|
||||
@ -162,14 +168,11 @@ module.exports = grammar({
|
||||
)),
|
||||
set_literal: $ => seq('{', sepBy(',', $._expression), '}'),
|
||||
|
||||
string_literal: $ => seq(
|
||||
'"',
|
||||
repeat(choice(
|
||||
token.immediate(prec(1, /[^"\n\\]+/)),
|
||||
$.escape_sequence
|
||||
)),
|
||||
'"'
|
||||
),
|
||||
string_literal: $ => seq('"', alias(optional($.string_content), 'content'), '"'),
|
||||
string_content: $ => repeat1(choice(
|
||||
token.immediate(prec(1, /[^"\n\\]+/)),
|
||||
$.escape_sequence
|
||||
)),
|
||||
escape_sequence: $ => token.immediate(seq(
|
||||
'\\',
|
||||
choice(
|
||||
|
104
src/grammar.json
vendored
104
src/grammar.json
vendored
@ -117,6 +117,10 @@
|
||||
"type": "SYMBOL",
|
||||
"name": "set_comprehension"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "string_interpolation"
|
||||
},
|
||||
{
|
||||
"type": "SEQ",
|
||||
"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": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
@ -1362,27 +1423,21 @@
|
||||
"value": "\""
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"type": "ALIAS",
|
||||
"content": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "IMMEDIATE_TOKEN",
|
||||
"content": {
|
||||
"type": "PREC",
|
||||
"value": 1,
|
||||
"content": {
|
||||
"type": "PATTERN",
|
||||
"value": "[^\"\\n\\\\]+"
|
||||
}
|
||||
}
|
||||
"type": "SYMBOL",
|
||||
"name": "string_content"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "escape_sequence"
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"named": false,
|
||||
"value": "content"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
@ -1390,6 +1445,29 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"string_content": {
|
||||
"type": "REPEAT1",
|
||||
"content": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "IMMEDIATE_TOKEN",
|
||||
"content": {
|
||||
"type": "PREC",
|
||||
"value": 1,
|
||||
"content": {
|
||||
"type": "PATTERN",
|
||||
"value": "[^\"\\n\\\\]+"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "escape_sequence"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"escape_sequence": {
|
||||
"type": "IMMEDIATE_TOKEN",
|
||||
"content": {
|
||||
|
165
src/node-types.json
vendored
165
src/node-types.json
vendored
@ -71,6 +71,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -146,6 +150,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -229,6 +237,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -332,6 +344,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -350,6 +366,21 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "content",
|
||||
"named": false,
|
||||
"fields": {},
|
||||
"children": {
|
||||
"multiple": true,
|
||||
"required": false,
|
||||
"types": [
|
||||
{
|
||||
"type": "escape_sequence",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "generator",
|
||||
"named": true,
|
||||
@ -418,6 +449,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -525,6 +560,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -601,6 +640,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -684,6 +727,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -766,6 +813,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -850,6 +901,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -1054,6 +1109,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -1149,6 +1208,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -1228,6 +1291,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -1303,6 +1370,10 @@
|
||||
"type": "set_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_interpolation",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
@ -1326,7 +1397,7 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"type": "string_content",
|
||||
"named": true,
|
||||
"fields": {},
|
||||
"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": "!=",
|
||||
"named": false
|
||||
@ -1436,6 +1595,10 @@
|
||||
"type": "[",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": "\\(",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": "\\/",
|
||||
"named": false
|
||||
|
8952
src/parser.c
vendored
8952
src/parser.c
vendored
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user