Constant tree_sitter_svelte::GRAMMAR [−][src]
pub const GRAMMAR: &'static str = "/// <reference types=\"tree-sitter-cli/dsl\" />\n\nmodule.exports = grammar({\n name: \"svelte\",\n\n externals: ($) => [\n $._start_tag_name,\n $._script_start_tag_name,\n $._style_start_tag_name,\n $._end_tag_name,\n $.errorneous_end_tag_name,\n \"/>\",\n $._implicit_end_tag,\n $.raw_text,\n $.raw_text_expr,\n $.raw_text_await,\n $.raw_text_each,\n $.comment,\n ],\n\n extras: () => [/\\s+/],\n\n rules: {\n document: ($) => repeat($._node),\n\n _node: ($) => choice($.script_element, $.style_element, $._statement),\n\n _statement: ($) =>\n choice(\n $.comment,\n $._text,\n $.element,\n $.if_statement,\n $.key_statement,\n $.each_statement,\n $.await_statement\n ),\n\n element: ($) =>\n choice(\n seq(\n $.start_tag,\n repeat($._node),\n choice($.end_tag, $._implicit_end_tag)\n ),\n $.self_closing_tag\n ),\n\n start_tag: ($) =>\n seq(\"<\", alias($._start_tag_name, $.tag_name), repeat($.attribute), \">\"),\n\n self_closing_tag: ($) =>\n seq(\"<\", alias($._start_tag_name, $.tag_name), repeat($.attribute), \"/>\"),\n\n end_tag: ($) => seq(\"</\", alias($._end_tag_name, $.tag_name), \">\"),\n\n errorneous_end_tag: ($) => seq(\"</\", $.errorneous_end_tag_name, \">\"),\n\n // -------- script and style element ---------\n script_element: ($) =>\n seq(\n alias($.script_start_tag, $.start_tag),\n optional($.raw_text),\n $.end_tag\n ),\n script_start_tag: ($) =>\n seq(\n \"<\",\n alias($._script_start_tag_name, $.tag_name),\n repeat($.attribute),\n \">\"\n ),\n\n style_element: ($) =>\n seq(\n alias($.style_start_tag, $.start_tag),\n optional($.raw_text),\n $.end_tag\n ),\n style_start_tag: ($) =>\n seq(\n \"<\",\n alias($._style_start_tag_name, $.tag_name),\n repeat($.attribute),\n \">\"\n ),\n // -------------------------------------------\n\n // ------- svelte attribute --------\n attribute: ($) =>\n choice(\n seq(\n $.attribute_name,\n optional(\n seq(\n \"=\",\n choice(\n $.attribute_value,\n $.quoted_attribute_value,\n $.expr_attribute_value\n )\n )\n )\n ),\n alias($.expression, $.attribute_name)\n ),\n\n attribute_name: () => /[^<>{}\"\'/=\\s]+/,\n attribute_value: ($) => /[^<>{}\"\'/=\\s]+/,\n expr_attribute_value: ($) => $.expression,\n quoted_attribute_value: ($) =>\n choice(\n seq(\"\'\", optional(alias(/[^\']+/, $.attribute_value)), \"\'\"),\n seq(\'\"\', optional(alias(/[^\"]+/, $.attribute_value)), \'\"\')\n ),\n\n _text: ($) => choice(alias(/[^<>{}]+/, $.text), $._expression),\n\n _expression: ($) =>\n choice($.expression, $.html_expr, alias(\"{}\", $.expression)),\n\n expression: ($) => seq(\"{\", $.raw_text_expr, \"}\"),\n\n html_expr: ($) =>\n seq(\n \"{\",\n \"@\",\n alias(\"html\", $.special_block_keyword),\n optional($.raw_text_expr),\n \"}\"\n ),\n // ------------ if-else ------------------\n\n if_statement: ($) =>\n seq(\n $.if_start_expr,\n repeat($._node),\n choice($.else_if_statement, $.else_statement, $.if_end_expr)\n ),\n\n else_if_statement: ($) =>\n seq(\n $.else_if_expr,\n repeat($._node),\n choice($.if_end_expr, $.else_statement, $.else_if_statement)\n ),\n\n else_statement: ($) => seq($.else_expr, repeat($._node), $.if_end_expr),\n\n if_start_expr: ($) =>\n seq(\"{\", \"#\", alias(\"if\", $.special_block_keyword), $.raw_text_expr, \"}\"),\n\n else_expr: ($) =>\n seq(\"{\", \":\", alias(\"else\", $.special_block_keyword), \"}\"),\n\n else_if_expr: ($) =>\n seq(\n \"{\",\n \":\",\n alias(\"else\", $.special_block_keyword),\n alias(\"if\", $.special_block_keyword),\n optional($.raw_text_expr),\n \"}\"\n ),\n\n if_end_expr: ($) =>\n seq(\"{\", \"/\", alias(\"if\", $.special_block_keyword), \"}\"),\n\n // ----------- each and await ------------\n\n each_statement: ($) =>\n seq($.each_start_expr, repeat($._node), $.each_end_expr),\n\n each_start_expr: ($) =>\n seq(\n \"{\",\n \"#\",\n alias(\"each\", $.special_block_keyword),\n choice(\n $.raw_text_expr,\n seq($.raw_text_each, alias(\"as\", $.as), $.raw_text_expr)\n ),\n \"}\"\n ),\n\n each_end_expr: ($) =>\n seq(\"{\", \"/\", alias(\"each\", $.special_block_keyword), \"}\"),\n\n await_statement: ($) =>\n prec.right(\n seq(\n $.await_start_expr,\n repeat($._node),\n choice($.then_statement, $.catch_statement, $.await_end_expr)\n )\n ),\n\n then_statement: ($) =>\n seq(\n $.then_expr,\n repeat($._node),\n choice($.await_end_expr, $.catch_statement)\n ),\n\n catch_statement: ($) =>\n seq($.catch_expr, repeat($._node), $.await_end_expr),\n\n await_start_expr: ($) =>\n seq(\n \"{\",\n \"#\",\n alias(\"await\", $.special_block_keyword),\n choice(\n $.raw_text_expr,\n seq($.raw_text_await, alias(\"then\", $.then), $.raw_text_expr)\n ),\n \"}\"\n ),\n then_expr: ($) =>\n seq(\n \"{\",\n \":\",\n alias(\"then\", $.special_block_keyword),\n optional($.raw_text_expr),\n \"}\"\n ),\n catch_expr: ($) =>\n seq(\n \"{\",\n \":\",\n alias(\"catch\", $.special_block_keyword),\n optional($.raw_text_expr),\n \"}\"\n ),\n await_end_expr: ($) =>\n seq(\"{\", \"/\", alias(\"await\", $.special_block_keyword), \"}\"),\n\n\n // ----------------- Key statement ----------------------\n key_statement: ($) =>\n seq($.key_start_expr, repeat($._node), $.key_end_expr),\n\n key_start_expr: ($) =>\n seq(\n \"{\",\n \"#\",\n alias(\"key\", $.special_block_keyword),\n choice($.raw_text_expr),\n \"}\"\n ),\n\n key_end_expr: ($) =>\n seq(\"{\", \"/\", alias(\"key\", $.special_block_keyword), \"}\"),\n },\n});\n";
The source of the JavaScript tree-sitter grammar description.