tree-sitter-dust/grammar.js
2023-09-29 07:17:47 -04:00

86 lines
1.4 KiB
JavaScript

module.exports = grammar({
name: 'dust',
rules: {
root: $ => repeat1($.item),
item: $ => choice(
$.comment,
$.statement,
),
comment: $ => prec.left(seq(token('#'), /.*/)),
statement: $ => choice(
$.closed_statement,
$.open_statement,
),
closed_statement: $ => seq($.expression, $.close),
open_statement: $ => prec.left(seq($.expression)),
expression: $ => choice(
prec(0, $.value),
prec(1, $.identifier),
prec(2, $.operation),
prec(3, $.control_flow),
),
close: $ => ";",
identifier: $ => /[a-zA-Z|_|.]+(_[a-zA-Z]+)*/,
value: $ => choice(
$.integer,
$.float,
$.string,
$.list,
$.empty,
$.boolean,
$.function,
),
float: $ => /\d+\.\d*/,
integer: $ => /\d+/,
string: $ => /("|'|`)(.*?)("|'|`)/,
function: $ => /{(.*?)}/,
empty: $ => '()',
boolean: $ => choice(
'true',
'false',
),
list: $ => seq(
'(',
repeat1(seq($.value, optional(','))),
')'
),
operator: $ => choice(
'+',
'-',
'=',
),
operation: $ => prec.left(seq(
$.expression,
$.operator,
$.expression,
)),
control_flow: $ => prec.right(seq(
'if',
$.expression,
'then',
$.statement,
optional(seq('else', $.statement))
)),
}
});