pub const GRAMMAR: &str = "/**\n * @file JSON grammar for tree-sitter\n * @author Max Brunsfeld\n * @license MIT\n */\n\n/* eslint-disable arrow-parens */\n/* eslint-disable camelcase */\n/* eslint-disable-next-line spaced-comment */\n/// <reference types=\"tree-sitter-cli/dsl\" />\n// @ts-check\n\nmodule.exports = grammar({\n name: \'json\',\n\n extras: $ => [\n /\\s/,\n $.comment,\n ],\n\n supertypes: $ => [\n $._value,\n ],\n\n rules: {\n document: $ => repeat($._value),\n\n _value: $ => choice(\n $.object,\n $.array,\n $.number,\n $.string,\n $.true,\n $.false,\n $.null,\n ),\n\n object: $ => seq(\n \'{\', commaSep($.pair), \'}\',\n ),\n\n pair: $ => seq(\n field(\'key\', choice($.string, $.number)),\n \':\',\n field(\'value\', $._value),\n ),\n\n array: $ => seq(\n \'[\', commaSep($._value), \']\',\n ),\n\n string: $ => choice(\n seq(\'\"\', \'\"\'),\n seq(\'\"\', $.string_content, \'\"\'),\n ),\n\n string_content: $ => repeat1(choice(\n token.immediate(prec(1, /[^\\\\\"\\n]+/)),\n $.escape_sequence,\n )),\n\n escape_sequence: _ => token.immediate(seq(\n \'\\\\\',\n /(\\\"|\\\\|\\/|b|f|n|r|t|u)/,\n )),\n\n number: _ => {\n const decimal_digits = /\\d+/;\n const signed_integer = seq(optional(\'-\'), decimal_digits);\n const exponent_part = seq(choice(\'e\', \'E\'), signed_integer);\n\n const decimal_integer_literal = seq(\n optional(\'-\'),\n choice(\n \'0\',\n seq(/[1-9]/, optional(decimal_digits)),\n ),\n );\n\n const decimal_literal = choice(\n seq(decimal_integer_literal, \'.\', optional(decimal_digits), optional(exponent_part)),\n seq(decimal_integer_literal, optional(exponent_part)),\n );\n\n return token(decimal_literal);\n },\n\n true: _ => \'true\',\n\n false: _ => \'false\',\n\n null: _ => \'null\',\n\n comment: _ => token(choice(\n seq(\'//\', /.*/),\n seq(\n \'/*\',\n /[^*]*\\*+([^/*][^*]*\\*+)*/,\n \'/\',\n ),\n )),\n },\n});\n\n/**\n * Creates a rule to match one or more of the rules separated by a comma\n *\n * @param {RuleOrLiteral} rule\n *\n * @return {SeqRule}\n *\n */\nfunction commaSep1(rule) {\n return seq(rule, repeat(seq(\',\', rule)));\n}\n\n/**\n * Creates a rule to optionally match one or more of the rules separated by a comma\n *\n * @param {RuleOrLiteral} rule\n *\n * @return {ChoiceRule}\n *\n */\nfunction commaSep(rule) {\n return optional(commaSep1(rule));\n}\n";
Expand description
GRAMMAR