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))))
|
||||||
(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))))
|
||||||
|
13
grammar.js
13
grammar.js
@ -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
92
src/grammar.json
vendored
@ -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
165
src/node-types.json
vendored
@ -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
8952
src/parser.c
vendored
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user