More.
This commit is contained in:
102
grammar.js
102
grammar.js
@@ -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),
|
||||
),
|
||||
},
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user