module.exports = grammar({ name: 'nixshell', rules: { source_file: $ => seq($.first_line, repeat($.next_line)), first_line: $ => seq($.shebang_open, $.opt_ws, optional(seq($.env, $.ws)), $.nix_shell), next_line: $ => seq($.newline, choice( $.annotation_line, // TODO: capture this repeat(/./), )), annotation_line: $ => seq($.shebang_open, $.opt_ws, $.nix_shell, $.nix_shell_args), // payload_next_line: $ => /\n.*/, // payload_line: $ => /.*/, // payload_line: $ => repeat(/./), // nix_shell_directive_open: $ => '#!nix-shell', // TODO: actually parse nix-shell arguments nix_shell_args: $ => ' -i bash', // TODO: hide these (prefix with underscore) shebang_open: $ => '#!', // TODO: allow `usr/bin/env`, `env` env: $ => '/usr/bin/env', nix_shell: $ => 'nix-shell', ws: $ => / +/, opt_ws: $ => / */, newline: $ => '\n', } });