module.exports = grammar({ name: 'dust', rules: { source: $ => repeat(choice( $.comment, $.statement, )), comment: $ => prec.left(seq(token('#'), /.*/, optional(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: $ => token(choice( '+', '-', '=', )), operation: $ => prec.left(seq( $.expression, $.operator, $.expression, )), control_flow: $ => prec.right(seq( 'if', $.expression, 'then', $.statement, optional(seq('else', $.statement)) )), } });