Parse string literals
This commit is contained in:
@@ -271,6 +271,18 @@ pub fn expr(db: &dyn Database, ast: AstNode) -> Expr {
|
|||||||
Integer(0)
|
Integer(0)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
} else if let Some(str) = ast.get_field(db, "string") {
|
||||||
|
let contents = str.contents(db);
|
||||||
|
let s = contents
|
||||||
|
.slice(1..(contents.len_chars() - 1))
|
||||||
|
.to_string()
|
||||||
|
.replace(r"\\", "\\")
|
||||||
|
.replace(r"\n", "\n")
|
||||||
|
.replace(r"\r", "\r")
|
||||||
|
.replace(r"\t", "\t")
|
||||||
|
.replace(r"\0", "\0")
|
||||||
|
.replace("\\\"", "\"");
|
||||||
|
Value(String(s))
|
||||||
} else if let Some(unary) = ast.get_field(db, "unary") {
|
} else if let Some(unary) = ast.get_field(db, "unary") {
|
||||||
let op = unary.expect_field(db, "op").expect_parse(db);
|
let op = unary.expect_field(db, "op").expect_parse(db);
|
||||||
let term = Arc::new(expr(db, unary.expect_field(db, "term")));
|
let term = Arc::new(expr(db, unary.expect_field(db, "term")));
|
||||||
|
|||||||
@@ -66,6 +66,16 @@ export default grammar({
|
|||||||
|
|
||||||
integer: _ => choice("0", /-?[1-9][0-9]*/),
|
integer: _ => choice("0", /-?[1-9][0-9]*/),
|
||||||
|
|
||||||
|
string_literal: $ => seq(
|
||||||
|
'"',
|
||||||
|
repeat(choice($.string_content, $.escape_sequence)),
|
||||||
|
'"',
|
||||||
|
),
|
||||||
|
|
||||||
|
string_content: _ => token.immediate(prec(1, /[^\\"]+/)),
|
||||||
|
|
||||||
|
escape_sequence: _ => token.immediate(/\\[bfnrtv\"\\]/),
|
||||||
|
|
||||||
type_alias: $ => seq(
|
type_alias: $ => seq(
|
||||||
"type",
|
"type",
|
||||||
field("name", $.symbol),
|
field("name", $.symbol),
|
||||||
@@ -130,6 +140,7 @@ export default grammar({
|
|||||||
field("false", "False"),
|
field("false", "False"),
|
||||||
field("symbol", $.name),
|
field("symbol", $.name),
|
||||||
field("integer", $.integer),
|
field("integer", $.integer),
|
||||||
|
field("string", $.string_literal),
|
||||||
|
|
||||||
// operations
|
// operations
|
||||||
field("unary", $.unary_expr),
|
field("unary", $.unary_expr),
|
||||||
@@ -148,7 +159,7 @@ export default grammar({
|
|||||||
optional(seq(list(field("witness", $.variable)), ":")),
|
optional(seq(list(field("witness", $.variable)), ":")),
|
||||||
choice(
|
choice(
|
||||||
field("apply", $.apply),
|
field("apply", $.apply),
|
||||||
seq("{", list(field("clause", $.expr) ), "}"),
|
seq("{", list(field("clause", $.expr)), "}"),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|||||||
55
tree-sitter-kerolox/src/grammar.json
generated
55
tree-sitter-kerolox/src/grammar.json
generated
@@ -101,6 +101,53 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"string_literal": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "\""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "REPEAT",
|
||||||
|
"content": {
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "string_content"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "escape_sequence"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "\""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"string_content": {
|
||||||
|
"type": "IMMEDIATE_TOKEN",
|
||||||
|
"content": {
|
||||||
|
"type": "PREC",
|
||||||
|
"value": 1,
|
||||||
|
"content": {
|
||||||
|
"type": "PATTERN",
|
||||||
|
"value": "[^\\\\\"]+"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"escape_sequence": {
|
||||||
|
"type": "IMMEDIATE_TOKEN",
|
||||||
|
"content": {
|
||||||
|
"type": "PATTERN",
|
||||||
|
"value": "\\\\[bfnrtv\\\"\\\\]"
|
||||||
|
}
|
||||||
|
},
|
||||||
"type_alias": {
|
"type_alias": {
|
||||||
"type": "SEQ",
|
"type": "SEQ",
|
||||||
"members": [
|
"members": [
|
||||||
@@ -711,6 +758,14 @@
|
|||||||
"name": "integer"
|
"name": "integer"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "FIELD",
|
||||||
|
"name": "string",
|
||||||
|
"content": {
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "string_literal"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "FIELD",
|
"type": "FIELD",
|
||||||
"name": "unary",
|
"name": "unary",
|
||||||
|
|||||||
41
tree-sitter-kerolox/src/node-types.json
generated
41
tree-sitter-kerolox/src/node-types.json
generated
@@ -275,6 +275,16 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"string": {
|
||||||
|
"multiple": false,
|
||||||
|
"required": false,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "string_literal",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
"symbol": {
|
"symbol": {
|
||||||
"multiple": false,
|
"multiple": false,
|
||||||
"required": false,
|
"required": false,
|
||||||
@@ -532,6 +542,25 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "string_literal",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": false,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "escape_sequence",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string_content",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "tuple",
|
"type": "tuple",
|
||||||
"named": true,
|
"named": true,
|
||||||
@@ -639,6 +668,10 @@
|
|||||||
"type": "!=",
|
"type": "!=",
|
||||||
"named": false
|
"named": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "\"",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "&&",
|
"type": "&&",
|
||||||
"named": false
|
"named": false
|
||||||
@@ -747,6 +780,10 @@
|
|||||||
"type": "define",
|
"type": "define",
|
||||||
"named": false
|
"named": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "escape_sequence",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "import",
|
"type": "import",
|
||||||
"named": false
|
"named": false
|
||||||
@@ -767,6 +804,10 @@
|
|||||||
"type": "soft",
|
"type": "soft",
|
||||||
"named": false
|
"named": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "string_content",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "symbol",
|
"type": "symbol",
|
||||||
"named": true
|
"named": true
|
||||||
|
|||||||
10940
tree-sitter-kerolox/src/parser.c
generated
10940
tree-sitter-kerolox/src/parser.c
generated
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user