Constant GRAMMAR

Source
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