module.exports = grammar({ name: "TestLang", rules: { source_file: $ => repeat($._definition), _definition: $ => choice( $.function_definition //TODO others ), function_definition: $ => seq( 'fn', $.identifier, $.parameter_list, field("return_type", optional($._type)), $.block, ), parameter_list: $ => seq("(", /* TODO */ ")"), block: $ => seq( "{", choice( repeat($._statement), "", ), "}" ), _statement: $ => choice( $._return_statement ), _return_statement: $ => seq("return", $._expression, ";"), _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))), _type: $ => "bool", _type: $ => choice( $.primitive_type, ), primitive_type: $ => choice("bool", "int"), identifier: $ => /[a-z]+/, } });