2024-04-21 02:25:56 -07:00
|
|
|
module.exports = grammar({
|
|
|
|
name: "TestLang",
|
|
|
|
rules: {
|
2024-04-21 03:01:13 -07:00
|
|
|
source_file: $ => repeat($._definition),
|
|
|
|
|
|
|
|
_definition: $ => choice(
|
|
|
|
$.function_definition
|
|
|
|
//TODO others
|
2024-04-21 03:08:05 -07:00
|
|
|
),
|
2024-04-21 03:01:13 -07:00
|
|
|
|
2024-04-21 03:08:05 -07:00
|
|
|
function_definition: $ => seq(
|
|
|
|
"fn",
|
|
|
|
$.identifier,
|
|
|
|
$.parameter_list,
|
2024-04-23 02:13:44 -07:00
|
|
|
optional($._type),
|
2024-04-21 03:08:05 -07:00
|
|
|
$.block,
|
|
|
|
),
|
|
|
|
parameter_list: $ => seq("(", /* TODO */ ")"),
|
2024-04-21 03:01:13 -07:00
|
|
|
|
2024-04-21 03:08:05 -07:00
|
|
|
block: $ => seq(
|
|
|
|
"{",
|
2024-04-23 02:13:44 -07:00
|
|
|
repeat(optional($._statement)),
|
2024-04-21 03:08:05 -07:00
|
|
|
"}"
|
|
|
|
),
|
2024-04-21 03:01:13 -07:00
|
|
|
|
2024-04-21 03:08:05 -07:00
|
|
|
_statement: $ => choice(
|
|
|
|
$._return_statement
|
|
|
|
),
|
|
|
|
|
|
|
|
_return_statement: $ => seq("return", $._expression, ";"),
|
|
|
|
|
2024-04-23 02:13:44 -07:00
|
|
|
_expression: $ => choice($.identifier, $.unary, $.binary),
|
|
|
|
|
|
|
|
unary: $ => prec(4, choice(seq("-", $._expression), seq("!", $._expression))),
|
|
|
|
binary: $ => choice(prec.left(2, seq($._expression, "*", $._expression)), prec.left(1, seq($._expression, "+", $._expression))),
|
2024-04-21 03:08:05 -07:00
|
|
|
|
|
|
|
_type: $ => "bool",
|
|
|
|
|
|
|
|
identifier: $ => /[a-z]+/,
|
2024-04-21 02:25:56 -07:00
|
|
|
}
|
|
|
|
});
|