finish TS grammar
This commit is contained in:
@@ -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(
|
||||
|
Reference in New Issue
Block a user