module.exports = grammar({ name: 'Groovy', conflicts: $ => [ [$.qualified_name] ], rules: { // TODO: add the actual grammar rules source_file: $ => seq( optional($._shebang_comment), optional(seq($.package_declaration, repeat($._sep))), optional($._script_statements) ), static_modifier: $ => 'static', _shebang_comment: $ => token.immediate(/#!.*\n/), _script_statements: $ => seq( $._script_statement, repeat( seq( $._sep, $._script_statement ) ), repeat($._sep) ), import_declaration: $ => seq( 'import', optional($.static_modifier), field('name', seq($.qualified_name, optional($.wildcard_import) ) ) ), wildcard_import: $ => seq('.','*'), package_declaration: $ => seq( optional($._annotations), 'package', field('name', $.qualified_name) ), _annotations: $ => seq( $.annotation, repeat($.annotation) ), annotation: $ => seq( '@', $.qualified_name ), _script_statement: $ => choice( $.import_declaration, $.statement, $.method_declaration ), expression: $ => choice( $.qualified_name ), qualified_name: $ => seq( $.identifier, repeat(seq('.', $.identifier)) ), identifier: $ => /[A-Za-z_][A-Za-z_0-9]*/, statement: $ => choice( $.expression ), method_declaration: $ => seq('def', field('name', $.identifier)), _sep: $ => choice('\n', ';'), word: $ => $.identifier } });