{
  "$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json",
  "name": "lotus",
  "word": "identifier",
  "rules": {
    "source_file": {
      "type": "REPEAT",
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SYMBOL",
            "name": "option_stmt"
          },
          {
            "type": "SYMBOL",
            "name": "class_decl"
          },
          {
            "type": "SYMBOL",
            "name": "sub_decl"
          },
          {
            "type": "SYMBOL",
            "name": "function_decl"
          },
          {
            "type": "SYMBOL",
            "name": "statement"
          }
        ]
      }
    },
    "option_stmt": {
      "type": "SEQ",
      "members": [
        {
          "type": "FIELD",
          "name": "keyword",
          "content": {
            "type": "ALIAS",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "STRING",
                  "value": "Option Public"
                },
                {
                  "type": "STRING",
                  "value": "Option Private"
                },
                {
                  "type": "STRING",
                  "value": "Option Declare"
                },
                {
                  "type": "STRING",
                  "value": "Option Explicit"
                }
              ]
            },
            "named": true,
            "value": "keyword"
          }
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "class_decl": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "Class"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "statement"
          }
        },
        {
          "type": "STRING",
          "value": "End"
        },
        {
          "type": "STRING",
          "value": "Class"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "sub_decl": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "Sub"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "FIELD",
              "name": "parameters",
              "content": {
                "type": "SYMBOL",
                "name": "param_list"
              }
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "statement"
          }
        },
        {
          "type": "STRING",
          "value": "End"
        },
        {
          "type": "STRING",
          "value": "Sub"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "function_decl": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "Function"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "FIELD",
              "name": "parameters",
              "content": {
                "type": "SYMBOL",
                "name": "param_list"
              }
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "As"
                },
                {
                  "type": "SYMBOL",
                  "name": "type"
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "statement"
          }
        },
        {
          "type": "STRING",
          "value": "End"
        },
        {
          "type": "STRING",
          "value": "Function"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "param_list": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "SYMBOL",
                "name": "param"
              },
              {
                "type": "STRING",
                "value": ","
              }
            ]
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "param"
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "param": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "identifier"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "As"
                },
                {
                  "type": "SYMBOL",
                  "name": "type"
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        }
      ]
    },
    "type": {
      "type": "SYMBOL",
      "name": "identifier"
    },
    "statement": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "comment"
        },
        {
          "type": "SYMBOL",
          "name": "keyword_stmt"
        },
        {
          "type": "SYMBOL",
          "name": "identifier_stmt"
        },
        {
          "type": "SYMBOL",
          "name": "if_statement"
        },
        {
          "type": "SYMBOL",
          "name": "for_statement"
        },
        {
          "type": "SYMBOL",
          "name": "do_statement"
        },
        {
          "type": "SYMBOL",
          "name": "while_statement"
        },
        {
          "type": "SYMBOL",
          "name": "select_statement"
        },
        {
          "type": "SYMBOL",
          "name": "dim_statement"
        },
        {
          "type": "SYMBOL",
          "name": "set_statement"
        },
        {
          "type": "SYMBOL",
          "name": "let_statement"
        },
        {
          "type": "SYMBOL",
          "name": "call_statement"
        }
      ]
    },
    "if_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "If"
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        },
        {
          "type": "STRING",
          "value": "Then"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "statement"
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "ElseIf"
                },
                {
                  "type": "SYMBOL",
                  "name": "expression"
                },
                {
                  "type": "STRING",
                  "value": "Then"
                },
                {
                  "type": "SYMBOL",
                  "name": "_eol"
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SYMBOL",
                    "name": "statement"
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "Else"
                },
                {
                  "type": "SYMBOL",
                  "name": "_eol"
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SYMBOL",
                    "name": "statement"
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": "End"
        },
        {
          "type": "STRING",
          "value": "If"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "for_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "For"
        },
        {
          "type": "SYMBOL",
          "name": "identifier"
        },
        {
          "type": "STRING",
          "value": "="
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        },
        {
          "type": "STRING",
          "value": "To"
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "Step"
                },
                {
                  "type": "SYMBOL",
                  "name": "expression"
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "statement"
          }
        },
        {
          "type": "STRING",
          "value": "Next"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "do_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "Do"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "STRING",
                      "value": "While"
                    },
                    {
                      "type": "STRING",
                      "value": "Until"
                    }
                  ]
                },
                {
                  "type": "SYMBOL",
                  "name": "expression"
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "statement"
          }
        },
        {
          "type": "STRING",
          "value": "Loop"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "STRING",
                      "value": "While"
                    },
                    {
                      "type": "STRING",
                      "value": "Until"
                    }
                  ]
                },
                {
                  "type": "SYMBOL",
                  "name": "expression"
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "while_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "While"
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "statement"
          }
        },
        {
          "type": "STRING",
          "value": "Wend"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "select_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "Select"
        },
        {
          "type": "STRING",
          "value": "Case"
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "case_clause"
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "Case"
                },
                {
                  "type": "STRING",
                  "value": "Else"
                },
                {
                  "type": "SYMBOL",
                  "name": "_eol"
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SYMBOL",
                    "name": "statement"
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": "End"
        },
        {
          "type": "STRING",
          "value": "Select"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "case_clause": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "Case"
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "statement"
          }
        }
      ]
    },
    "dim_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "Dim"
        },
        {
          "type": "SYMBOL",
          "name": "identifier"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "As"
                },
                {
                  "type": "SYMBOL",
                  "name": "type"
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "set_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "Set"
        },
        {
          "type": "SYMBOL",
          "name": "identifier"
        },
        {
          "type": "STRING",
          "value": "="
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "let_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "Let"
        },
        {
          "type": "SYMBOL",
          "name": "identifier"
        },
        {
          "type": "STRING",
          "value": "="
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "call_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "Call"
        },
        {
          "type": "SYMBOL",
          "name": "identifier"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "argument_list"
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "expression": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "primary_expression"
        },
        {
          "type": "SYMBOL",
          "name": "binary_expression"
        },
        {
          "type": "SYMBOL",
          "name": "unary_expression"
        },
        {
          "type": "SYMBOL",
          "name": "function_call"
        },
        {
          "type": "SYMBOL",
          "name": "member_expression"
        }
      ]
    },
    "primary_expression": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "identifier"
        },
        {
          "type": "SYMBOL",
          "name": "number"
        },
        {
          "type": "SYMBOL",
          "name": "string"
        },
        {
          "type": "SYMBOL",
          "name": "boolean"
        },
        {
          "type": "SYMBOL",
          "name": "parenthesized_expression"
        }
      ]
    },
    "binary_expression": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "arithmetic_expression"
        },
        {
          "type": "SYMBOL",
          "name": "comparison_expression"
        },
        {
          "type": "SYMBOL",
          "name": "logical_expression"
        }
      ]
    },
    "arithmetic_expression": {
      "type": "PREC_LEFT",
      "value": 0,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "expression"
          },
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "STRING",
                "value": "+"
              },
              {
                "type": "STRING",
                "value": "-"
              },
              {
                "type": "STRING",
                "value": "*"
              },
              {
                "type": "STRING",
                "value": "/"
              },
              {
                "type": "STRING",
                "value": "\\"
              },
              {
                "type": "STRING",
                "value": "^"
              },
              {
                "type": "STRING",
                "value": "Mod"
              }
            ]
          },
          {
            "type": "SYMBOL",
            "name": "expression"
          }
        ]
      }
    },
    "comparison_expression": {
      "type": "PREC_LEFT",
      "value": 0,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "expression"
          },
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "STRING",
                "value": "="
              },
              {
                "type": "STRING",
                "value": "<>"
              },
              {
                "type": "STRING",
                "value": "<"
              },
              {
                "type": "STRING",
                "value": ">"
              },
              {
                "type": "STRING",
                "value": "<="
              },
              {
                "type": "STRING",
                "value": ">="
              }
            ]
          },
          {
            "type": "SYMBOL",
            "name": "expression"
          }
        ]
      }
    },
    "logical_expression": {
      "type": "PREC_LEFT",
      "value": 0,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "expression"
          },
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "STRING",
                "value": "And"
              },
              {
                "type": "STRING",
                "value": "Or"
              },
              {
                "type": "STRING",
                "value": "Not"
              }
            ]
          },
          {
            "type": "SYMBOL",
            "name": "expression"
          }
        ]
      }
    },
    "unary_expression": {
      "type": "SEQ",
      "members": [
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "STRING",
              "value": "+"
            },
            {
              "type": "STRING",
              "value": "-"
            },
            {
              "type": "STRING",
              "value": "Not"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        }
      ]
    },
    "function_call": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "identifier"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "argument_list"
            },
            {
              "type": "BLANK"
            }
          ]
        }
      ]
    },
    "argument_list": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "SYMBOL",
                "name": "expression"
              },
              {
                "type": "STRING",
                "value": ","
              }
            ]
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "expression"
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "member_expression": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "expression"
        },
        {
          "type": "STRING",
          "value": "."
        },
        {
          "type": "SYMBOL",
          "name": "identifier"
        }
      ]
    },
    "parenthesized_expression": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "SYMBOL",
          "name": "expression"
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "number": {
      "type": "TOKEN",
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "PATTERN",
            "value": "\\d+\\.\\d+"
          },
          {
            "type": "PATTERN",
            "value": "\\d+"
          }
        ]
      }
    },
    "string": {
      "type": "TOKEN",
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "PATTERN",
            "value": "\"[^\"]*\""
          },
          {
            "type": "PATTERN",
            "value": "'[^']*'"
          }
        ]
      }
    },
    "boolean": {
      "type": "CHOICE",
      "members": [
        {
          "type": "STRING",
          "value": "True"
        },
        {
          "type": "STRING",
          "value": "False"
        }
      ]
    },
    "comment": {
      "type": "TOKEN",
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SEQ",
            "members": [
              {
                "type": "STRING",
                "value": "'"
              },
              {
                "type": "PATTERN",
                "value": ".*"
              }
            ]
          },
          {
            "type": "SEQ",
            "members": [
              {
                "type": "STRING",
                "value": "Rem"
              },
              {
                "type": "PATTERN",
                "value": "\\s+.*"
              }
            ]
          }
        ]
      }
    },
    "_eol": {
      "type": "TOKEN",
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "PATTERN",
            "value": "\\r?\\n"
          },
          {
            "type": "PATTERN",
            "value": ";"
          }
        ]
      }
    },
    "keyword_stmt": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "keyword"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "identifier_stmt": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "identifier"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "PATTERN",
            "value": "[^'\\n\\r]+"
          }
        },
        {
          "type": "SYMBOL",
          "name": "_eol"
        }
      ]
    },
    "identifier": {
      "type": "PATTERN",
      "value": "[A-Za-z][_A-Za-z0-9]*"
    },
    "keyword": {
      "type": "TOKEN",
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "STRING",
            "value": "Dim"
          },
          {
            "type": "STRING",
            "value": "Set"
          },
          {
            "type": "STRING",
            "value": "Let"
          },
          {
            "type": "STRING",
            "value": "If"
          },
          {
            "type": "STRING",
            "value": "Else"
          },
          {
            "type": "STRING",
            "value": "ElseIf"
          },
          {
            "type": "STRING",
            "value": "End"
          },
          {
            "type": "STRING",
            "value": "For"
          },
          {
            "type": "STRING",
            "value": "Each"
          },
          {
            "type": "STRING",
            "value": "Do"
          },
          {
            "type": "STRING",
            "value": "Loop"
          },
          {
            "type": "STRING",
            "value": "While"
          },
          {
            "type": "STRING",
            "value": "Wend"
          },
          {
            "type": "STRING",
            "value": "Select"
          },
          {
            "type": "STRING",
            "value": "Case"
          },
          {
            "type": "STRING",
            "value": "Call"
          },
          {
            "type": "STRING",
            "value": "Use"
          },
          {
            "type": "STRING",
            "value": "UseLS"
          },
          {
            "type": "STRING",
            "value": "Then"
          },
          {
            "type": "STRING",
            "value": "To"
          },
          {
            "type": "STRING",
            "value": "Step"
          },
          {
            "type": "STRING",
            "value": "Next"
          },
          {
            "type": "STRING",
            "value": "True"
          },
          {
            "type": "STRING",
            "value": "False"
          },
          {
            "type": "STRING",
            "value": "Rem"
          },
          {
            "type": "STRING",
            "value": "Class"
          },
          {
            "type": "STRING",
            "value": "Sub"
          },
          {
            "type": "STRING",
            "value": "Function"
          },
          {
            "type": "STRING",
            "value": "As"
          },
          {
            "type": "STRING",
            "value": "Option"
          },
          {
            "type": "STRING",
            "value": "Public"
          },
          {
            "type": "STRING",
            "value": "Private"
          },
          {
            "type": "STRING",
            "value": "Declare"
          },
          {
            "type": "STRING",
            "value": "Explicit"
          }
        ]
      }
    }
  },
  "extras": [
    {
      "type": "PATTERN",
      "value": "\\s|\\\\\\r?\\n"
    },
    {
      "type": "SYMBOL",
      "name": "comment"
    }
  ],
  "conflicts": [
    [
      "primary_expression",
      "function_call"
    ],
    [
      "comparison_expression",
      "unary_expression"
    ],
    [
      "arithmetic_expression",
      "unary_expression"
    ],
    [
      "logical_expression",
      "unary_expression"
    ],
    [
      "unary_expression",
      "member_expression"
    ]
  ],
  "precedences": [],
  "externals": [],
  "inline": [],
  "supertypes": [],
  "reserved": {}
}