This commit is contained in:
2025-08-27 01:43:23 -04:00
parent 542d36f266
commit 1f7a6fe01e
4 changed files with 3946 additions and 3302 deletions

View File

@@ -21,50 +21,65 @@ module.exports = grammar({
$.bool,
$.word,
$.binexp,
$.callexp,
$.parexp,
$.block,
$.eqexp,
$.vardef,
$.lambda,
$.callexp,
$.funcdef,
$.lambda,
$.seqexp,
$.ifexp,
$.tern_ifexp,
$.block,
$.parexp,
),
num: (_) => /\d+/,
bool: (_) => choice("TRUE", "T", "FALSE", "F"),
bool: (_) => choice("T", "F"),
word: (_) => /[a-zA-Z_]\w*/,
binexp: ($) =>
seqexp: ($) =>
prec.left(
1,
seq(
field("left", $._exp),
field("op", choice("+", "-", "*", "/", "eq")),
field("right", $._exp),
-1, // lowest
seq(field("first", $._exp), repeat1(seq(";", field("rest", $._exp)))),
),
vardef: ($) =>
prec.right(1, seq(field("name", $.word), "=", field("value", $._exp))),
eqexp: ($) =>
prec.left(2, seq(field("left", $._exp), "==", field("right", $._exp))),
binexp: ($) =>
choice(
prec.left(
3,
seq(
field("left", $._exp),
field("op", choice("+", "-")),
field("right", $._exp),
),
),
prec.left(
4,
seq(
field("left", $._exp),
field("op", choice("*", "/")),
field("right", $._exp),
),
),
),
callexp: ($) =>
prec.left(
1, // lower than funcdef
5,
seq(field("fn", $.word), "(", optional(commaSep($._exp)), ")"),
),
parexp: ($) => seq("(", $._exp, ")"),
block: ($) => seq("{", repeat($._exp), "}"),
vardef: ($) =>
prec.right(1, seq(field("name", $.word), "=", field("value", $._exp))),
lambda: ($) =>
prec.right(
2,
seq("\\", field("params", $.params), field("body", $._exp)),
),
funcdef: ($) =>
prec.right(
3, // higher precedence than call
6,
seq(
field("name", $.word),
field("params", $.params),
@@ -72,33 +87,36 @@ module.exports = grammar({
),
),
lambda: ($) =>
prec.right(
6,
seq("\\", field("params", $.params), field("body", $._exp)),
),
parexp: ($) => seq("(", $._exp, ")"),
block: ($) => seq("{", repeat($._exp), "}"),
params: ($) => seq("(", optional(commaSep($.word)), ")"),
ifexp: ($) =>
choice(
seq(
"_if",
"(",
field("cond", $._exp),
",",
field("then", $._exp),
",",
field("else", $._exp),
")",
),
prec.right(
seq(
"if",
field("cond", $._exp),
field("then", $._exp),
choice(seq("else", field("else", $._exp)), field("else", $._exp)),
),
seq(
"?",
field("cond", $._exp),
field("then", $._exp),
optional("else"),
field("else", $._exp),
),
),
tern_ifexp: ($) =>
seq(
"?",
field("cond", $._exp),
field("then", $._exp),
field("else", $._exp),
),
},
});