{
"$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json",
"name": "heex",
"rules": {
"fragment": {
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_node"
}
},
"_node": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "doctype"
},
{
"type": "SYMBOL",
"name": "tag"
},
{
"type": "SYMBOL",
"name": "component"
},
{
"type": "SYMBOL",
"name": "text"
},
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "SYMBOL",
"name": "directive"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
},
"doctype": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "<!"
},
{
"type": "STRING",
"value": "DOCTYPE"
},
{
"type": "STRING",
"value": "html"
},
{
"type": "STRING",
"value": ">"
}
]
},
"tag": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "start_tag"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_node"
}
},
{
"type": "SYMBOL",
"name": "end_tag"
}
]
},
{
"type": "SYMBOL",
"name": "self_closing_tag"
}
]
},
"component": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "start_component"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_node"
},
{
"type": "SYMBOL",
"name": "slot"
}
]
}
},
{
"type": "SYMBOL",
"name": "end_component"
}
]
},
{
"type": "SYMBOL",
"name": "self_closing_component"
}
]
},
"slot": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "start_slot"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_node"
}
},
{
"type": "SYMBOL",
"name": "end_slot"
}
]
},
{
"type": "SYMBOL",
"name": "self_closing_slot"
}
]
},
"start_tag": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "<"
},
{
"type": "SYMBOL",
"name": "tag_name"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "attribute"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "SYMBOL",
"name": "special_attribute"
}
]
}
},
{
"type": "STRING",
"value": ">"
}
]
},
"end_tag": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "</"
},
{
"type": "SYMBOL",
"name": "tag_name"
},
{
"type": "STRING",
"value": ">"
}
]
},
"self_closing_tag": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "<"
},
{
"type": "SYMBOL",
"name": "tag_name"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "attribute"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "SYMBOL",
"name": "special_attribute"
}
]
}
},
{
"type": "STRING",
"value": "/>"
}
]
},
"start_component": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "<"
},
{
"type": "SYMBOL",
"name": "component_name"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "attribute"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "SYMBOL",
"name": "special_attribute"
}
]
}
},
{
"type": "STRING",
"value": ">"
}
]
},
"end_component": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "</"
},
{
"type": "SYMBOL",
"name": "component_name"
},
{
"type": "STRING",
"value": ">"
}
]
},
"self_closing_component": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "<"
},
{
"type": "SYMBOL",
"name": "component_name"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "attribute"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "SYMBOL",
"name": "special_attribute"
}
]
}
},
{
"type": "STRING",
"value": "/>"
}
]
},
"start_slot": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "<:"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "tag_name"
},
"named": true,
"value": "slot_name"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "attribute"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "SYMBOL",
"name": "special_attribute"
}
]
}
},
{
"type": "STRING",
"value": ">"
}
]
},
"end_slot": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "</:"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "tag_name"
},
"named": true,
"value": "slot_name"
},
{
"type": "STRING",
"value": ">"
}
]
},
"self_closing_slot": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "<:"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "tag_name"
},
"named": true,
"value": "slot_name"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "attribute"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "SYMBOL",
"name": "special_attribute"
}
]
}
},
{
"type": "STRING",
"value": "/>"
}
]
},
"expression": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{"
},
{
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_expression_value"
}
},
"named": true,
"value": "expression_value"
},
{
"type": "STRING",
"value": "}"
}
]
}
}
]
},
"_expression_value": {
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "[^{}]+"
},
{
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "{"
},
"named": false,
"value": "left"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_expression_value"
}
},
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "}"
},
"named": false,
"value": "right"
}
]
}
]
},
"special_attribute": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "special_attribute_name"
},
{
"type": "STRING",
"value": "="
},
{
"type": "SYMBOL",
"name": "expression"
}
]
},
"special_attribute_name": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ":let"
},
{
"type": "STRING",
"value": ":for"
},
{
"type": "STRING",
"value": ":stream"
},
{
"type": "STRING",
"value": ":if"
}
]
},
"attribute": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "attribute_name"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "="
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "quoted_attribute_value"
},
{
"type": "SYMBOL",
"name": "attribute_value"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
]
},
{
"type": "BLANK"
}
]
}
]
},
"attribute_value": {
"type": "PATTERN",
"value": "[^<>{}\"'=\\s]+"
},
"quoted_attribute_value": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "'"
},
{
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "PATTERN",
"value": "[^']+"
},
"named": true,
"value": "attribute_value"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "'"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "\""
},
{
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "PATTERN",
"value": "[^\"]+"
},
"named": true,
"value": "attribute_value"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "\""
}
]
}
]
},
"directive": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "<%"
},
{
"type": "STRING",
"value": "<%="
},
{
"type": "STRING",
"value": "<%%"
},
{
"type": "STRING",
"value": "<%%="
}
]
},
{
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "partial_expression_value"
},
{
"type": "SYMBOL",
"name": "ending_expression_value"
},
{
"type": "SYMBOL",
"name": "expression_value"
}
]
},
{
"type": "STRING",
"value": "%>"
}
]
}
}
]
},
"comment": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_html_comment"
},
{
"type": "SYMBOL",
"name": "_bang_comment"
},
{
"type": "SYMBOL",
"name": "_hash_comment"
}
]
},
"_html_comment": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "<!--"
},
{
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "REPEAT",
"content": {
"type": "PATTERN",
"value": "[^-]+|-"
}
},
{
"type": "STRING",
"value": "-->"
}
]
}
}
]
},
"_bang_comment": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "<%!--"
},
{
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "REPEAT",
"content": {
"type": "PATTERN",
"value": "[^-]+|-"
}
},
{
"type": "STRING",
"value": "--%>"
}
]
}
}
]
},
"_hash_comment": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "<%#"
},
{
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_code"
}
},
{
"type": "STRING",
"value": "%>"
}
]
}
}
]
},
"expression_value": {
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "_code"
}
},
"partial_expression_value": {
"type": "SEQ",
"members": [
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_code"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "do"
},
{
"type": "STRING",
"value": "->"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "#"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_code"
}
}
]
},
{
"type": "BLANK"
}
]
}
]
},
"ending_expression_value": {
"type": "SEQ",
"members": [
{
"type": "PATTERN",
"value": "end[\\)\\]\\}]*"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_code"
}
}
]
},
"component_name": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "module"
},
{
"type": "BLANK"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "."
},
{
"type": "SYMBOL",
"name": "function"
}
]
}
]
},
{
"type": "SYMBOL",
"name": "module"
}
]
},
"module": {
"type": "PATTERN",
"value": "([A-Z][^\\-<>{}!\"'/=\\s\\.]*)(\\.[A-Z][^\\-<>{}!\"'/=\\s\\.]*)*"
},
"function": {
"type": "PATTERN",
"value": "[a-z][^\\-<>{}!\"'/=\\s\\.]*"
},
"_code": {
"type": "PATTERN",
"value": "[^%\\s]+|[%\\s]"
},
"tag_name": {
"type": "PATTERN",
"value": "[a-z]+[^<>{}!\"'/=\\s]*"
},
"attribute_name": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": -1,
"content": {
"type": "PATTERN",
"value": "[^:<>{}\"'/=\\s][^<>{}\"'/=\\s]*"
}
}
},
"text": {
"type": "PATTERN",
"value": "[^<>{}\\s]([^<>{}]*[^<>{}\\s])?"
}
},
"extras": [
{
"type": "PATTERN",
"value": "\\s"
}
],
"conflicts": [],
"precedences": [],
"externals": [],
"inline": [],
"supertypes": []
}