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`
- `{field1: val1, field2: val2}` field construction
- `match expr with <match cases>`: [pattern matching](##pattern-matching)
- `'Tag expr`
- `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: "difference"
- `a * b`: identical to `\`a*b\`(a, b)` name: "times"

View File

@@ -22,6 +22,27 @@ module.exports = grammar({
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: {
source_file: $ => repeat($._definition),
@@ -184,26 +205,25 @@ module.exports = grammar({
$.field_access,
$.function_call,
$.record_expr,
// TODO
),
let_binding: $ => seq(
let_binding: $ => prec("let", seq(
'let',
$.identifier,
'=',
$.expression,
optional('in'),
$.expression,
),
)),
await_binding: $ => seq(
await_binding: $ => prec("let", seq(
'await',
$.identifier,
'=',
$.expression,
optional('in'),
$.expression,
),
)),
type_downcast: $ => seq(
$._atom,
@@ -218,13 +238,74 @@ module.exports = grammar({
$.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(
$._atom,
$.let_binding,
$.await_binding,
$.type_downcast,
$.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(

View File

@@ -932,78 +932,86 @@
]
},
"let_binding": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "let"
},
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "STRING",
"value": "="
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "in"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "expression"
}
]
"type": "PREC",
"value": "let",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "let"
},
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "STRING",
"value": "="
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "in"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"await_binding": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "await"
},
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "STRING",
"value": "="
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "in"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "expression"
}
]
"type": "PREC",
"value": "let",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "await"
},
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "STRING",
"value": "="
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "in"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"type_downcast": {
"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": {
"type": "CHOICE",
"members": [
@@ -1086,6 +1458,62 @@
{
"type": "SYMBOL",
"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"
}
],
"conflicts": [],
"precedences": [],
"conflicts": [
[
"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": [],
"inline": [],
"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",
"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",
"named": true,
@@ -97,17 +189,43 @@
}
},
{
"type": "expression",
"type": "divide_expr",
"named": true,
"fields": {},
"children": {
"multiple": false,
"multiple": true,
"required": true,
"types": [
{
"type": "await_binding",
"type": "expression",
"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",
"named": true
@@ -128,6 +246,89 @@
"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": "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",
"named": true
@@ -140,6 +341,18 @@
"type": "list_expression",
"named": true
},
{
"type": "match_expr",
"named": true
},
{
"type": "multiply_expr",
"named": true
},
{
"type": "negate_expr",
"named": true
},
{
"type": "num_literal",
"named": true
@@ -152,9 +365,21 @@
"type": "string_literal",
"named": true
},
{
"type": "sub_expr",
"named": true
},
{
"type": "tag_expr",
"named": true
},
{
"type": "type_downcast",
"named": true
},
{
"type": "with_expr",
"named": true
}
]
}
@@ -457,6 +682,21 @@
"named": true,
"fields": {}
},
{
"type": "if_expr",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{
"type": "just_type",
"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",
"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",
"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",
"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",
"named": true,
@@ -1302,10 +1742,26 @@
"type": ")",
"named": false
},
{
"type": "*",
"named": false
},
{
"type": "+",
"named": false
},
{
"type": "++",
"named": false
},
{
"type": ",",
"named": false
},
{
"type": "-",
"named": false
},
{
"type": "->",
"named": false
@@ -1318,6 +1774,10 @@
"type": "...",
"named": false
},
{
"type": "/",
"named": false
},
{
"type": ":",
"named": false
@@ -1330,6 +1790,10 @@
"type": "=",
"named": false
},
{
"type": "=>",
"named": false
},
{
"type": "?",
"named": false
@@ -1342,6 +1806,14 @@
"type": "]",
"named": false
},
{
"type": "^",
"named": false
},
{
"type": "and",
"named": false
},
{
"type": "await",
"named": false
@@ -1359,6 +1831,10 @@
"type": "def",
"named": false
},
{
"type": "else",
"named": false
},
{
"type": "escape_sequence",
"named": true
@@ -1371,6 +1847,10 @@
"type": "extensible",
"named": false
},
{
"type": "if",
"named": false
},
{
"type": "in",
"named": false
@@ -1379,6 +1859,10 @@
"type": "let",
"named": false
},
{
"type": "match",
"named": false
},
{
"type": "string_middle",
"named": true
@@ -1387,6 +1871,10 @@
"type": "tag",
"named": true
},
{
"type": "then",
"named": false
},
{
"type": "type",
"named": false

41290
tree-sitter/src/parser.c generated

File diff suppressed because it is too large Load Diff