stuff i guess
This commit is contained in:
89
grammar.js
Normal file
89
grammar.js
Normal file
@@ -0,0 +1,89 @@
|
||||
/**
|
||||
* @file Ground VM textual representation highlighter
|
||||
* @author Maxwell Jeffress <maxwelljeffress@proton.me>
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
/// <reference types="tree-sitter-cli/dsl" />
|
||||
// @ts-check
|
||||
|
||||
module.exports = grammar({
|
||||
name: "ground",
|
||||
|
||||
extras: $ => [
|
||||
/\s/,
|
||||
$.comment,
|
||||
],
|
||||
|
||||
rules: {
|
||||
source_file: $ => repeat($._statement),
|
||||
|
||||
_statement: $ => choice(
|
||||
$.label_definition,
|
||||
$.function_definition,
|
||||
$.struct_definition,
|
||||
$.instruction,
|
||||
),
|
||||
|
||||
comment: $ => token(seq('#', /.*/)),
|
||||
|
||||
label_definition: $ => seq('@', $.identifier),
|
||||
|
||||
function_definition: $ => seq(
|
||||
'fun',
|
||||
field('name', $.function_reference),
|
||||
field('return_type', $.type_reference),
|
||||
repeat(seq(field('arg_type', $.type_reference), field('arg_name', $.direct_reference))),
|
||||
repeat($._statement),
|
||||
'endfun'
|
||||
),
|
||||
|
||||
struct_definition: $ => seq(
|
||||
'struct',
|
||||
field('name', $.type_reference),
|
||||
repeat($._statement),
|
||||
'endstruct'
|
||||
),
|
||||
|
||||
instruction: $ => seq(
|
||||
field('keyword', $.keyword),
|
||||
repeat($._argument)
|
||||
),
|
||||
|
||||
keyword: $ => choice(
|
||||
'if', 'jump', 'end', 'input', 'print', 'println',
|
||||
'set', 'init', 'gettype', 'exists', 'setlist', 'setlistat',
|
||||
'getlistat', 'getlistsize', 'listappend', 'getstrsize', 'getstrcharat',
|
||||
'add', 'subtract', 'multiply', 'divide', 'equal', 'inequal', 'not',
|
||||
'greater', 'lesser', 'stoi', 'stod', 'tostring', 'return', 'call',
|
||||
'use', 'extern', 'getfield', 'setfield'
|
||||
),
|
||||
|
||||
_argument: $ => choice(
|
||||
$.value_reference,
|
||||
$.direct_reference,
|
||||
$.line_reference,
|
||||
$.function_reference,
|
||||
$.type_reference,
|
||||
$.string,
|
||||
$.int,
|
||||
$.double,
|
||||
$.char,
|
||||
$.bool
|
||||
),
|
||||
|
||||
value_reference: $ => seq('$', $.identifier),
|
||||
direct_reference: $ => seq('&', $.identifier),
|
||||
line_reference: $ => seq('%', $.identifier),
|
||||
function_reference: $ => seq('!', $.identifier),
|
||||
type_reference: $ => seq('-', $.identifier),
|
||||
|
||||
identifier: $ => /[a-zA-Z_][a-zA-Z0-9_]*/,
|
||||
|
||||
string: $ => /"[^"]*"/,
|
||||
int: $ => /-?\d+/,
|
||||
double: $ => /-?\d+\.\d+/,
|
||||
char: $ => /'[^']'/,
|
||||
bool: $ => choice('true', 'false'),
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user