{
  "$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json",
  "name": "nsis",
  "word": "identifier",
  "rules": {
    "source_file": {
      "type": "REPEAT",
      "content": {
        "type": "SYMBOL",
        "name": "_toplevel"
      }
    },
    "_toplevel": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "function_definition"
        },
        {
          "type": "SYMBOL",
          "name": "section_definition"
        },
        {
          "type": "SYMBOL",
          "name": "section_group"
        },
        {
          "type": "SYMBOL",
          "name": "page_ex_block"
        },
        {
          "type": "SYMBOL",
          "name": "macro_definition"
        },
        {
          "type": "SYMBOL",
          "name": "preproc_conditional"
        },
        {
          "type": "SYMBOL",
          "name": "statement"
        },
        {
          "type": "SYMBOL",
          "name": "label"
        },
        {
          "type": "SYMBOL",
          "name": "_newline"
        }
      ]
    },
    "_newline": {
      "type": "PATTERN",
      "value": "\\n"
    },
    "function_definition": {
      "type": "SEQ",
      "members": [
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "function",
            "flags": "i"
          },
          "named": false,
          "value": "Function"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "_value"
          }
        },
        {
          "type": "SYMBOL",
          "name": "_newline"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_body_item"
          }
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "functionend",
            "flags": "i"
          },
          "named": false,
          "value": "FunctionEnd"
        }
      ]
    },
    "section_definition": {
      "type": "SEQ",
      "members": [
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "section",
            "flags": "i"
          },
          "named": false,
          "value": "Section"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "FIELD",
            "name": "parameter",
            "content": {
              "type": "SYMBOL",
              "name": "_value"
            }
          }
        },
        {
          "type": "SYMBOL",
          "name": "_newline"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_body_item"
          }
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "sectionend",
            "flags": "i"
          },
          "named": false,
          "value": "SectionEnd"
        }
      ]
    },
    "section_group": {
      "type": "SEQ",
      "members": [
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "sectiongroup",
            "flags": "i"
          },
          "named": false,
          "value": "SectionGroup"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "FIELD",
            "name": "parameter",
            "content": {
              "type": "SYMBOL",
              "name": "_value"
            }
          }
        },
        {
          "type": "SYMBOL",
          "name": "_newline"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "section_definition"
              },
              {
                "type": "SYMBOL",
                "name": "section_group"
              },
              {
                "type": "SYMBOL",
                "name": "preproc_conditional"
              },
              {
                "type": "SYMBOL",
                "name": "statement"
              },
              {
                "type": "SYMBOL",
                "name": "label"
              },
              {
                "type": "SYMBOL",
                "name": "_newline"
              }
            ]
          }
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "sectiongroupend",
            "flags": "i"
          },
          "named": false,
          "value": "SectionGroupEnd"
        }
      ]
    },
    "page_ex_block": {
      "type": "SEQ",
      "members": [
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "pageex",
            "flags": "i"
          },
          "named": false,
          "value": "PageEx"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "FIELD",
              "name": "type",
              "content": {
                "type": "SYMBOL",
                "name": "_value"
              }
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "_newline"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_body_item"
          }
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "pageexend",
            "flags": "i"
          },
          "named": false,
          "value": "PageExEnd"
        }
      ]
    },
    "macro_definition": {
      "type": "SEQ",
      "members": [
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "!macro",
            "flags": "i"
          },
          "named": false,
          "value": "!macro"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "FIELD",
            "name": "parameter",
            "content": {
              "type": "SYMBOL",
              "name": "identifier"
            }
          }
        },
        {
          "type": "SYMBOL",
          "name": "_newline"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_macro_body_item"
          }
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "!macroend",
            "flags": "i"
          },
          "named": false,
          "value": "!macroend"
        }
      ]
    },
    "_body_item": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "macro_definition"
        },
        {
          "type": "SYMBOL",
          "name": "preproc_conditional"
        },
        {
          "type": "SYMBOL",
          "name": "statement"
        },
        {
          "type": "SYMBOL",
          "name": "label"
        },
        {
          "type": "SYMBOL",
          "name": "_newline"
        }
      ]
    },
    "_macro_body_item": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "function_definition"
        },
        {
          "type": "SYMBOL",
          "name": "section_definition"
        },
        {
          "type": "SYMBOL",
          "name": "section_group"
        },
        {
          "type": "SYMBOL",
          "name": "page_ex_block"
        },
        {
          "type": "SYMBOL",
          "name": "macro_definition"
        },
        {
          "type": "SYMBOL",
          "name": "preproc_conditional"
        },
        {
          "type": "SYMBOL",
          "name": "statement"
        },
        {
          "type": "SYMBOL",
          "name": "label"
        },
        {
          "type": "SYMBOL",
          "name": "_newline"
        }
      ]
    },
    "preproc_conditional": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "keyword",
          "content": {
            "type": "ALIAS",
            "content": {
              "type": "SYMBOL",
              "name": "_preproc_if_keyword"
            },
            "named": true,
            "value": "preproc_keyword"
          }
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_value"
          }
        },
        {
          "type": "SYMBOL",
          "name": "_newline"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_body_item"
          }
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "preproc_else"
          }
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "!endif",
            "flags": "i"
          },
          "named": false,
          "value": "!endif"
        }
      ]
    },
    "preproc_else": {
      "type": "SEQ",
      "members": [
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "!else",
            "flags": "i"
          },
          "named": false,
          "value": "!else"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "FIELD",
                  "name": "modifier",
                  "content": {
                    "type": "SYMBOL",
                    "name": "identifier"
                  }
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SYMBOL",
                    "name": "_value"
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "_newline"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_body_item"
          }
        }
      ]
    },
    "_preproc_if_keyword": {
      "type": "CHOICE",
      "members": [
        {
          "type": "PATTERN",
          "value": "!ifdef",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!ifndef",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!ifmacrodef",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!ifmacrondef",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!if",
          "flags": "i"
        }
      ]
    },
    "statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "preproc_directive"
            },
            {
              "type": "SYMBOL",
              "name": "plugin_call"
            },
            {
              "type": "SYMBOL",
              "name": "variable_declaration"
            },
            {
              "type": "SYMBOL",
              "name": "macro_invocation"
            },
            {
              "type": "SYMBOL",
              "name": "command"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "_newline"
        }
      ]
    },
    "preproc_directive": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "directive",
          "content": {
            "type": "SYMBOL",
            "name": "preproc_keyword"
          }
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "FIELD",
            "name": "argument",
            "content": {
              "type": "SYMBOL",
              "name": "_value"
            }
          }
        }
      ]
    },
    "preproc_keyword": {
      "type": "CHOICE",
      "members": [
        {
          "type": "PATTERN",
          "value": "!addincludedir",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!addplugindir",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!appendfile",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!assert",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!cd",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!define",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!delfile",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!echo",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!error",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!execute",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!finalize",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!getdllversion",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!gettlbversion",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!include",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!insertmacro",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!makensis",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!packhdr",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!pragma",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!searchparse",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!searchreplace",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!system",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!tempfile",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!undef",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!uninstfinalize",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!verbose",
          "flags": "i"
        },
        {
          "type": "PATTERN",
          "value": "!warning",
          "flags": "i"
        }
      ]
    },
    "macro_invocation": {
      "type": "PREC_RIGHT",
      "value": 0,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "FIELD",
            "name": "name",
            "content": {
              "type": "SYMBOL",
              "name": "define_reference"
            }
          },
          {
            "type": "REPEAT",
            "content": {
              "type": "FIELD",
              "name": "argument",
              "content": {
                "type": "SYMBOL",
                "name": "_value"
              }
            }
          }
        ]
      }
    },
    "command": {
      "type": "PREC_RIGHT",
      "value": 0,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "FIELD",
            "name": "name",
            "content": {
              "type": "SYMBOL",
              "name": "identifier"
            }
          },
          {
            "type": "REPEAT",
            "content": {
              "type": "FIELD",
              "name": "argument",
              "content": {
                "type": "SYMBOL",
                "name": "_value"
              }
            }
          }
        ]
      }
    },
    "plugin_call": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "plugin",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        },
        {
          "type": "IMMEDIATE_TOKEN",
          "content": {
            "type": "STRING",
            "value": "::"
          }
        },
        {
          "type": "FIELD",
          "name": "function",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "FIELD",
            "name": "argument",
            "content": {
              "type": "SYMBOL",
              "name": "_value"
            }
          }
        }
      ]
    },
    "variable_declaration": {
      "type": "SEQ",
      "members": [
        {
          "type": "ALIAS",
          "content": {
            "type": "PATTERN",
            "value": "var",
            "flags": "i"
          },
          "named": false,
          "value": "Var"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "flag"
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        }
      ]
    },
    "label": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        },
        {
          "type": "IMMEDIATE_TOKEN",
          "content": {
            "type": "STRING",
            "value": ":"
          }
        }
      ]
    },
    "_value": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "string"
        },
        {
          "type": "SYMBOL",
          "name": "raw_string"
        },
        {
          "type": "SYMBOL",
          "name": "backtick_string"
        },
        {
          "type": "SYMBOL",
          "name": "variable"
        },
        {
          "type": "SYMBOL",
          "name": "define_reference"
        },
        {
          "type": "SYMBOL",
          "name": "lang_string_reference"
        },
        {
          "type": "SYMBOL",
          "name": "number"
        },
        {
          "type": "SYMBOL",
          "name": "flag"
        },
        {
          "type": "SYMBOL",
          "name": "label_reference"
        },
        {
          "type": "SYMBOL",
          "name": "comparison_operator"
        },
        {
          "type": "SYMBOL",
          "name": "pipe_operator"
        },
        {
          "type": "SYMBOL",
          "name": "identifier"
        }
      ]
    },
    "pipe_operator": {
      "type": "STRING",
      "value": "|"
    },
    "label_reference": {
      "type": "PATTERN",
      "value": ":[a-zA-Z_.][a-zA-Z0-9_.]*"
    },
    "string": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "\""
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "string_content"
              },
              {
                "type": "SYMBOL",
                "name": "_interpolation"
              }
            ]
          }
        },
        {
          "type": "STRING",
          "value": "\""
        }
      ]
    },
    "raw_string": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "'"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "raw_string_content"
              },
              {
                "type": "SYMBOL",
                "name": "_interpolation"
              }
            ]
          }
        },
        {
          "type": "STRING",
          "value": "'"
        }
      ]
    },
    "backtick_string": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "`"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "backtick_string_content"
              },
              {
                "type": "SYMBOL",
                "name": "_interpolation"
              }
            ]
          }
        },
        {
          "type": "STRING",
          "value": "`"
        }
      ]
    },
    "_interpolation": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "variable"
        },
        {
          "type": "SYMBOL",
          "name": "define_reference"
        },
        {
          "type": "SYMBOL",
          "name": "lang_string_reference"
        },
        {
          "type": "SYMBOL",
          "name": "escape_sequence"
        }
      ]
    },
    "string_content": {
      "type": "PREC",
      "value": -1,
      "content": {
        "type": "PATTERN",
        "value": "[^\"\\n$]+"
      }
    },
    "raw_string_content": {
      "type": "PREC",
      "value": -1,
      "content": {
        "type": "PATTERN",
        "value": "[^'\\n$]+"
      }
    },
    "backtick_string_content": {
      "type": "PREC",
      "value": -1,
      "content": {
        "type": "PATTERN",
        "value": "[^`\\n$]+"
      }
    },
    "escape_sequence": {
      "type": "TOKEN",
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "PATTERN",
            "value": "\\$\\\\."
          },
          {
            "type": "STRING",
            "value": "$$"
          }
        ]
      }
    },
    "variable": {
      "type": "PATTERN",
      "value": "\\$([a-zA-Z_]\\w*|[0-9])"
    },
    "define_reference": {
      "type": "PATTERN",
      "value": "\\$\\{[\\!\\w\\.:\\^-]+\\}"
    },
    "lang_string_reference": {
      "type": "PATTERN",
      "value": "\\$\\([\\!\\w\\.:\\^-]+\\)"
    },
    "number": {
      "type": "PATTERN",
      "value": "[+-]?[0-9]+(\\.[0-9]+)?|0[xX][0-9a-fA-F]+"
    },
    "flag": {
      "type": "PATTERN",
      "value": "\\/[a-zA-Z_]\\w*(=[^\\s]*)?"
    },
    "comparison_operator": {
      "type": "CHOICE",
      "members": [
        {
          "type": "STRING",
          "value": "="
        },
        {
          "type": "STRING",
          "value": "!="
        },
        {
          "type": "STRING",
          "value": "<>"
        },
        {
          "type": "STRING",
          "value": "<"
        },
        {
          "type": "STRING",
          "value": ">"
        }
      ]
    },
    "identifier": {
      "type": "PATTERN",
      "value": "[a-zA-Z_.][a-zA-Z0-9_.]*"
    },
    "comment": {
      "type": "TOKEN",
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "PATTERN",
            "value": "[;#]"
          },
          {
            "type": "PATTERN",
            "value": "[^\\n]*"
          }
        ]
      }
    },
    "block_comment": {
      "type": "TOKEN",
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "/*"
          },
          {
            "type": "PATTERN",
            "value": "[^*]*\\*+([^/*][^*]*\\*+)*"
          },
          {
            "type": "STRING",
            "value": "/"
          }
        ]
      }
    },
    "line_continuation": {
      "type": "TOKEN",
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "\\"
          },
          {
            "type": "PATTERN",
            "value": "\\r?\\n"
          }
        ]
      }
    }
  },
  "extras": [
    {
      "type": "PATTERN",
      "value": "[ \\t\\r]"
    },
    {
      "type": "SYMBOL",
      "name": "line_continuation"
    },
    {
      "type": "SYMBOL",
      "name": "comment"
    },
    {
      "type": "SYMBOL",
      "name": "block_comment"
    }
  ],
  "conflicts": [],
  "precedences": [],
  "externals": [],
  "inline": [],
  "supertypes": [],
  "reserved": {}
}