finish TS grammar

This commit is contained in:
2025-09-21 13:19:07 +02:00
parent b4b6edd2f2
commit dcc8500e2c
5 changed files with 35678 additions and 6832 deletions

View File

@@ -365,7 +365,10 @@ def add = a -> b -> a + b
- `if cond then a else b` - `if cond then a else b`
- `{field1: val1, field2: val2}` field construction - `{field1: val1, field2: val2}` field construction
- `match expr with <match cases>`: [pattern matching](##pattern-matching) - `match expr with <match cases>`: [pattern matching](##pattern-matching)
- `'Tag expr`
- `a = b` the [equality operator](##equality-operator) - `a = b` the [equality operator](##equality-operator)
- `-a`: identical to `\`-a\`(a)` name: "negate"
- `a ^ b`: identical to `\`a^b\`(a, b)` name: "exponent"
- `a + b`: identical to `\`a+b\`(a, b)` name: "sum" - `a + b`: identical to `\`a+b\`(a, b)` name: "sum"
- `a - b`: identical to `\`a-b\`(a, b)` name: "difference" - `a - b`: identical to `\`a-b\`(a, b)` name: "difference"
- `a * b`: identical to `\`a*b\`(a, b)` name: "times" - `a * b`: identical to `\`a*b\`(a, b)` name: "times"

View File

@@ -22,6 +22,27 @@ module.exports = grammar({
word: $ => $._identifier_tok, word: $ => $._identifier_tok,
precedences: _ => [
[
"exponent",
"multiplication",
"negate",
"addition",
"concat",
"with",
"equal",
"if",
"let",
"new_match_arm",
"match_arm",
"tag",
],
],
conflicts: $ => [
[$.match_expr, $.match_expr],
],
rules: { rules: {
source_file: $ => repeat($._definition), source_file: $ => repeat($._definition),
@@ -184,26 +205,25 @@ module.exports = grammar({
$.field_access, $.field_access,
$.function_call, $.function_call,
$.record_expr, $.record_expr,
// TODO
), ),
let_binding: $ => seq( let_binding: $ => prec("let", seq(
'let', 'let',
$.identifier, $.identifier,
'=', '=',
$.expression, $.expression,
optional('in'), optional('in'),
$.expression, $.expression,
), )),
await_binding: $ => seq( await_binding: $ => prec("let", seq(
'await', 'await',
$.identifier, $.identifier,
'=', '=',
$.expression, $.expression,
optional('in'), optional('in'),
$.expression, $.expression,
), )),
type_downcast: $ => seq( type_downcast: $ => seq(
$._atom, $._atom,
@@ -218,13 +238,74 @@ module.exports = grammar({
$.expression $.expression
)), )),
with_expr: $ => prec.left("with",
seq($.expression, 'with', $._atom)),
and_expr: $ => prec.left("with",
seq($.expression, 'and', $._atom)),
if_expr: $ => prec("if",
seq('if', $.expression, 'then', $.expression, 'else', $.expression)),
sub_expr: $ => prec.left("addition",
seq($.expression, '-', $.expression)),
add_expr: $ => prec.left("addition",
seq($.expression, '+', $.expression)),
divide_expr: $ => prec.left("multiplication",
seq($.expression, '/', $.expression)),
multiply_expr: $ => prec.left("multiplication",
seq($.expression, '*', $.expression)),
equal_expr: $ => prec.left("equal",
seq($.expression, '=', $.expression)),
concat_expr: $ => prec.left("concat",
seq($.expression, '++', $.expression)),
compose_expr: $ => prec.left("concat",
seq($.expression, '=>', $.expression)),
exponent_expr: $ => prec.left("exponent",
seq($.expression, '^', $._atom)),
match_arm: $ => prec("match_arm",
seq(
field('cases', seq($._atom, repeat(seq('|', $._atom)))),
'->', $.expression)),
match_expr: $ =>
seq('match', $.expression, 'with',
$.match_arm,
prec("new_match_arm", repeat(seq('|', $.match_arm)))),
negate_expr: $ => prec.right("negate",
seq('-', $.expression)),
tag_expr: $ => prec.right("tag",
seq($.tag, $.expression)),
expression: $ => choice( expression: $ => choice(
$._atom, $._atom,
$.let_binding, $.let_binding,
$.await_binding, $.await_binding,
$.type_downcast, $.type_downcast,
$.lambda, $.lambda,
// TODO $.with_expr,
$.and_expr,
$.if_expr,
$.match_expr,
$.tag_expr,
$.add_expr,
$.sub_expr,
$.divide_expr,
$.multiply_expr,
$.concat_expr,
$.compose_expr,
$.equal_expr,
$.exponent_expr,
$.negate_expr,
), ),
def: $ => seq( def: $ => seq(

View File

@@ -932,6 +932,9 @@
] ]
}, },
"let_binding": { "let_binding": {
"type": "PREC",
"value": "let",
"content": {
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
{ {
@@ -967,8 +970,12 @@
"name": "expression" "name": "expression"
} }
] ]
}
}, },
"await_binding": { "await_binding": {
"type": "PREC",
"value": "let",
"content": {
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
{ {
@@ -1004,6 +1011,7 @@
"name": "expression" "name": "expression"
} }
] ]
}
}, },
"type_downcast": { "type_downcast": {
"type": "SEQ", "type": "SEQ",
@@ -1064,6 +1072,370 @@
] ]
} }
}, },
"with_expr": {
"type": "PREC_LEFT",
"value": "with",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "with"
},
{
"type": "SYMBOL",
"name": "_atom"
}
]
}
},
"and_expr": {
"type": "PREC_LEFT",
"value": "with",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "and"
},
{
"type": "SYMBOL",
"name": "_atom"
}
]
}
},
"if_expr": {
"type": "PREC",
"value": "if",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "if"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "then"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "else"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"sub_expr": {
"type": "PREC_LEFT",
"value": "addition",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "-"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"add_expr": {
"type": "PREC_LEFT",
"value": "addition",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "+"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"divide_expr": {
"type": "PREC_LEFT",
"value": "multiplication",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "/"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"multiply_expr": {
"type": "PREC_LEFT",
"value": "multiplication",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "*"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"equal_expr": {
"type": "PREC_LEFT",
"value": "equal",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "="
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"concat_expr": {
"type": "PREC_LEFT",
"value": "concat",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "++"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"compose_expr": {
"type": "PREC_LEFT",
"value": "concat",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "=>"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"exponent_expr": {
"type": "PREC_LEFT",
"value": "exponent",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "^"
},
{
"type": "SYMBOL",
"name": "_atom"
}
]
}
},
"match_arm": {
"type": "PREC",
"value": "match_arm",
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "cases",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_atom"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "|"
},
{
"type": "SYMBOL",
"name": "_atom"
}
]
}
}
]
}
},
{
"type": "STRING",
"value": "->"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"match_expr": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "match"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "with"
},
{
"type": "SYMBOL",
"name": "match_arm"
},
{
"type": "PREC",
"value": "new_match_arm",
"content": {
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "|"
},
{
"type": "SYMBOL",
"name": "match_arm"
}
]
}
}
}
]
},
"negate_expr": {
"type": "PREC_RIGHT",
"value": "negate",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "-"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"tag_expr": {
"type": "PREC_RIGHT",
"value": "tag",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "tag"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"expression": { "expression": {
"type": "CHOICE", "type": "CHOICE",
"members": [ "members": [
@@ -1086,6 +1458,62 @@
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "lambda" "name": "lambda"
},
{
"type": "SYMBOL",
"name": "with_expr"
},
{
"type": "SYMBOL",
"name": "and_expr"
},
{
"type": "SYMBOL",
"name": "if_expr"
},
{
"type": "SYMBOL",
"name": "match_expr"
},
{
"type": "SYMBOL",
"name": "tag_expr"
},
{
"type": "SYMBOL",
"name": "add_expr"
},
{
"type": "SYMBOL",
"name": "sub_expr"
},
{
"type": "SYMBOL",
"name": "divide_expr"
},
{
"type": "SYMBOL",
"name": "multiply_expr"
},
{
"type": "SYMBOL",
"name": "concat_expr"
},
{
"type": "SYMBOL",
"name": "compose_expr"
},
{
"type": "SYMBOL",
"name": "equal_expr"
},
{
"type": "SYMBOL",
"name": "exponent_expr"
},
{
"type": "SYMBOL",
"name": "negate_expr"
} }
] ]
}, },
@@ -1170,8 +1598,64 @@
"name": "comment" "name": "comment"
} }
], ],
"conflicts": [], "conflicts": [
"precedences": [], [
"match_expr",
"match_expr"
]
],
"precedences": [
[
{
"type": "STRING",
"value": "exponent"
},
{
"type": "STRING",
"value": "multiplication"
},
{
"type": "STRING",
"value": "negate"
},
{
"type": "STRING",
"value": "addition"
},
{
"type": "STRING",
"value": "concat"
},
{
"type": "STRING",
"value": "with"
},
{
"type": "STRING",
"value": "equal"
},
{
"type": "STRING",
"value": "if"
},
{
"type": "STRING",
"value": "let"
},
{
"type": "STRING",
"value": "new_match_arm"
},
{
"type": "STRING",
"value": "match_arm"
},
{
"type": "STRING",
"value": "tag"
}
]
],
"externals": [], "externals": [],
"inline": [], "inline": [],
"supertypes": [], "supertypes": [],

View File

@@ -1,4 +1,66 @@
[ [
{
"type": "add_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{
"type": "and_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "char_literal",
"named": true
},
{
"type": "expression",
"named": true
},
{
"type": "field_access",
"named": true
},
{
"type": "function_call",
"named": true
},
{
"type": "ident_expr",
"named": true
},
{
"type": "list_expression",
"named": true
},
{
"type": "num_literal",
"named": true
},
{
"type": "record_expr",
"named": true
},
{
"type": "string_literal",
"named": true
}
]
}
},
{ {
"type": "await_binding", "type": "await_binding",
"named": true, "named": true,
@@ -37,6 +99,36 @@
] ]
} }
}, },
{
"type": "compose_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{
"type": "concat_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{ {
"type": "def", "type": "def",
"named": true, "named": true,
@@ -97,17 +189,43 @@
} }
}, },
{ {
"type": "expression", "type": "divide_expr",
"named": true, "named": true,
"fields": {}, "fields": {},
"children": { "children": {
"multiple": false, "multiple": true,
"required": true, "required": true,
"types": [ "types": [
{ {
"type": "await_binding", "type": "expression",
"named": true "named": true
}
]
}
}, },
{
"type": "equal_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{
"type": "exponent_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{ {
"type": "char_literal", "type": "char_literal",
"named": true "named": true
@@ -128,6 +246,89 @@
"type": "ident_expr", "type": "ident_expr",
"named": true "named": true
}, },
{
"type": "list_expression",
"named": true
},
{
"type": "num_literal",
"named": true
},
{
"type": "record_expr",
"named": true
},
{
"type": "string_literal",
"named": true
}
]
}
},
{
"type": "expression",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "add_expr",
"named": true
},
{
"type": "and_expr",
"named": true
},
{
"type": "await_binding",
"named": true
},
{
"type": "char_literal",
"named": true
},
{
"type": "compose_expr",
"named": true
},
{
"type": "concat_expr",
"named": true
},
{
"type": "divide_expr",
"named": true
},
{
"type": "equal_expr",
"named": true
},
{
"type": "exponent_expr",
"named": true
},
{
"type": "expression",
"named": true
},
{
"type": "field_access",
"named": true
},
{
"type": "function_call",
"named": true
},
{
"type": "ident_expr",
"named": true
},
{
"type": "if_expr",
"named": true
},
{ {
"type": "lambda", "type": "lambda",
"named": true "named": true
@@ -140,6 +341,18 @@
"type": "list_expression", "type": "list_expression",
"named": true "named": true
}, },
{
"type": "match_expr",
"named": true
},
{
"type": "multiply_expr",
"named": true
},
{
"type": "negate_expr",
"named": true
},
{ {
"type": "num_literal", "type": "num_literal",
"named": true "named": true
@@ -152,9 +365,21 @@
"type": "string_literal", "type": "string_literal",
"named": true "named": true
}, },
{
"type": "sub_expr",
"named": true
},
{
"type": "tag_expr",
"named": true
},
{ {
"type": "type_downcast", "type": "type_downcast",
"named": true "named": true
},
{
"type": "with_expr",
"named": true
} }
] ]
} }
@@ -457,6 +682,21 @@
"named": true, "named": true,
"fields": {} "fields": {}
}, },
{
"type": "if_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{ {
"type": "just_type", "type": "just_type",
"named": true, "named": true,
@@ -565,6 +805,95 @@
] ]
} }
}, },
{
"type": "match_arm",
"named": true,
"fields": {
"cases": {
"multiple": true,
"required": true,
"types": [
{
"type": "(",
"named": false
},
{
"type": ")",
"named": false
},
{
"type": "char_literal",
"named": true
},
{
"type": "expression",
"named": true
},
{
"type": "field_access",
"named": true
},
{
"type": "function_call",
"named": true
},
{
"type": "ident_expr",
"named": true
},
{
"type": "list_expression",
"named": true
},
{
"type": "num_literal",
"named": true
},
{
"type": "record_expr",
"named": true
},
{
"type": "string_literal",
"named": true
},
{
"type": "|",
"named": false
}
]
}
},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{
"type": "match_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
},
{
"type": "match_arm",
"named": true
}
]
}
},
{ {
"type": "multi_type_parameters", "type": "multi_type_parameters",
"named": true, "named": true,
@@ -616,6 +945,36 @@
] ]
} }
}, },
{
"type": "multiply_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{
"type": "negate_expr",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{ {
"type": "num_literal", "type": "num_literal",
"named": true, "named": true,
@@ -975,6 +1334,40 @@
] ]
} }
}, },
{
"type": "sub_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{
"type": "tag_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
},
{
"type": "tag",
"named": true
}
]
}
},
{ {
"type": "tagged_type", "type": "tagged_type",
"named": true, "named": true,
@@ -1227,6 +1620,53 @@
] ]
} }
}, },
{
"type": "with_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "char_literal",
"named": true
},
{
"type": "expression",
"named": true
},
{
"type": "field_access",
"named": true
},
{
"type": "function_call",
"named": true
},
{
"type": "ident_expr",
"named": true
},
{
"type": "list_expression",
"named": true
},
{
"type": "num_literal",
"named": true
},
{
"type": "record_expr",
"named": true
},
{
"type": "string_literal",
"named": true
}
]
}
},
{ {
"type": "with_type", "type": "with_type",
"named": true, "named": true,
@@ -1302,10 +1742,26 @@
"type": ")", "type": ")",
"named": false "named": false
}, },
{
"type": "*",
"named": false
},
{
"type": "+",
"named": false
},
{
"type": "++",
"named": false
},
{ {
"type": ",", "type": ",",
"named": false "named": false
}, },
{
"type": "-",
"named": false
},
{ {
"type": "->", "type": "->",
"named": false "named": false
@@ -1318,6 +1774,10 @@
"type": "...", "type": "...",
"named": false "named": false
}, },
{
"type": "/",
"named": false
},
{ {
"type": ":", "type": ":",
"named": false "named": false
@@ -1330,6 +1790,10 @@
"type": "=", "type": "=",
"named": false "named": false
}, },
{
"type": "=>",
"named": false
},
{ {
"type": "?", "type": "?",
"named": false "named": false
@@ -1342,6 +1806,14 @@
"type": "]", "type": "]",
"named": false "named": false
}, },
{
"type": "^",
"named": false
},
{
"type": "and",
"named": false
},
{ {
"type": "await", "type": "await",
"named": false "named": false
@@ -1359,6 +1831,10 @@
"type": "def", "type": "def",
"named": false "named": false
}, },
{
"type": "else",
"named": false
},
{ {
"type": "escape_sequence", "type": "escape_sequence",
"named": true "named": true
@@ -1371,6 +1847,10 @@
"type": "extensible", "type": "extensible",
"named": false "named": false
}, },
{
"type": "if",
"named": false
},
{ {
"type": "in", "type": "in",
"named": false "named": false
@@ -1379,6 +1859,10 @@
"type": "let", "type": "let",
"named": false "named": false
}, },
{
"type": "match",
"named": false
},
{ {
"type": "string_middle", "type": "string_middle",
"named": true "named": true
@@ -1387,6 +1871,10 @@
"type": "tag", "type": "tag",
"named": true "named": true
}, },
{
"type": "then",
"named": false
},
{ {
"type": "type", "type": "type",
"named": false "named": false

41290
tree-sitter/src/parser.c generated

File diff suppressed because it is too large Load Diff