{
  "$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json",
  "name": "sas",
  "word": "identifier",
  "rules": {
    "program": {
      "type": "REPEAT",
      "content": {
        "type": "SYMBOL",
        "name": "_top_level"
      }
    },
    "_top_level": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "data_step"
        },
        {
          "type": "SYMBOL",
          "name": "proc_sql_step"
        },
        {
          "type": "SYMBOL",
          "name": "proc_step"
        },
        {
          "type": "SYMBOL",
          "name": "macro_definition"
        },
        {
          "type": "SYMBOL",
          "name": "macro_if_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_do_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_variable_assignment"
        },
        {
          "type": "SYMBOL",
          "name": "include_statement"
        },
        {
          "type": "SYMBOL",
          "name": "libname_statement"
        },
        {
          "type": "SYMBOL",
          "name": "options_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_call_statement"
        },
        {
          "type": "SYMBOL",
          "name": "line_comment"
        },
        {
          "type": "SYMBOL",
          "name": "generic_statement"
        }
      ]
    },
    "block_comment": {
      "type": "TOKEN",
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "/*"
          },
          {
            "type": "PATTERN",
            "value": "[^*]*\\*+([^/*][^*]*\\*+)*"
          },
          {
            "type": "STRING",
            "value": "/"
          }
        ]
      }
    },
    "percent_comment": {
      "type": "TOKEN",
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "%*"
          },
          {
            "type": "PATTERN",
            "value": "[^;]*"
          },
          {
            "type": "STRING",
            "value": ";"
          }
        ]
      }
    },
    "line_comment": {
      "type": "TOKEN",
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "*"
          },
          {
            "type": "PATTERN",
            "value": "[^;]*"
          },
          {
            "type": "STRING",
            "value": ";"
          }
        ]
      }
    },
    "data_step": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "data_step_header"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_data_body_statement"
          }
        },
        {
          "type": "SYMBOL",
          "name": "run_statement"
        }
      ]
    },
    "data_step_header": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[dD][aA][tT][aA]"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "_dataset_list"
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "_dataset_list": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "dataset_name"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SEQ",
            "members": [
              {
                "type": "CHOICE",
                "members": [
                  {
                    "type": "STRING",
                    "value": ","
                  },
                  {
                    "type": "BLANK"
                  }
                ]
              },
              {
                "type": "SYMBOL",
                "name": "dataset_name"
              }
            ]
          }
        }
      ]
    },
    "dataset_name": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SEQ",
          "members": [
            {
              "type": "SYMBOL",
              "name": "_dname_part"
            },
            {
              "type": "STRING",
              "value": "."
            },
            {
              "type": "SYMBOL",
              "name": "_dname_part"
            }
          ]
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "TOKEN",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "STRING",
                  "value": "_NULL_"
                },
                {
                  "type": "STRING",
                  "value": "_null_"
                },
                {
                  "type": "STRING",
                  "value": "_DATA_"
                },
                {
                  "type": "STRING",
                  "value": "_data_"
                },
                {
                  "type": "STRING",
                  "value": "_LAST_"
                },
                {
                  "type": "STRING",
                  "value": "_last_"
                }
              ]
            }
          },
          "named": true,
          "value": "identifier"
        },
        {
          "type": "SYMBOL",
          "name": "_dname_part"
        }
      ]
    },
    "_dname_part": {
      "type": "PREC_RIGHT",
      "value": 0,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "identifier"
              },
              {
                "type": "SYMBOL",
                "name": "macro_variable_ref"
              }
            ]
          },
          {
            "type": "REPEAT",
            "content": {
              "type": "SYMBOL",
              "name": "macro_variable_ref"
            }
          }
        ]
      }
    },
    "proc_sql_step": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "proc_sql_header"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_proc_sql_statement"
          }
        },
        {
          "type": "SYMBOL",
          "name": "run_or_quit_statement"
        }
      ]
    },
    "proc_sql_header": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[pP][rR][oO][cC]"
        },
        {
          "type": "PATTERN",
          "value": "[sS][qQ][lL]"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_option_token"
          }
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "_proc_sql_statement": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "sql_create_statement"
        },
        {
          "type": "SYMBOL",
          "name": "sql_select_statement"
        },
        {
          "type": "SYMBOL",
          "name": "sql_insert_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_definition"
        },
        {
          "type": "SYMBOL",
          "name": "macro_if_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_do_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_variable_assignment"
        },
        {
          "type": "SYMBOL",
          "name": "include_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_call_statement"
        },
        {
          "type": "SYMBOL",
          "name": "line_comment"
        },
        {
          "type": "SYMBOL",
          "name": "null_statement"
        },
        {
          "type": "SYMBOL",
          "name": "generic_statement"
        }
      ]
    },
    "sql_create_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[cC][rR][eE][aA][tT][eE]"
        },
        {
          "type": "PATTERN",
          "value": "[tT][aA][bB][lL][eE]"
        },
        {
          "type": "FIELD",
          "name": "output",
          "content": {
            "type": "SYMBOL",
            "name": "dataset_name"
          }
        },
        {
          "type": "PATTERN",
          "value": "[aA][sS]"
        },
        {
          "type": "SYMBOL",
          "name": "sql_select_statement"
        }
      ]
    },
    "sql_select_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[sS][eE][lL][eE][cC][tT]"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_sql_stmt_tok"
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "PATTERN",
                  "value": "[fF][rR][oO][mM]"
                },
                {
                  "type": "SYMBOL",
                  "name": "table_reference"
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SYMBOL",
                    "name": "_sql_after_from_tok"
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "_sql_after_from_tok": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "sql_join_clause"
        },
        {
          "type": "SYMBOL",
          "name": "_sql_stmt_tok"
        }
      ]
    },
    "sql_join_clause": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[jJ][oO][iI][nN]"
        },
        {
          "type": "SYMBOL",
          "name": "table_reference"
        }
      ]
    },
    "table_reference": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "dataset_name"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "PATTERN",
                  "value": "[aA][sS]"
                },
                {
                  "type": "SYMBOL",
                  "name": "identifier"
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        }
      ]
    },
    "sql_insert_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[iI][nN][sS][eE][rR][tT]"
        },
        {
          "type": "PATTERN",
          "value": "[iI][nN][tT][oO]"
        },
        {
          "type": "SYMBOL",
          "name": "dataset_name"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "sql_select_statement"
            },
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SYMBOL",
                    "name": "_sql_stmt_tok"
                  }
                },
                {
                  "type": "STRING",
                  "value": ";"
                }
              ]
            }
          ]
        }
      ]
    },
    "_sql_stmt_tok": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "identifier"
        },
        {
          "type": "SYMBOL",
          "name": "string_literal"
        },
        {
          "type": "SYMBOL",
          "name": "macro_variable_ref"
        },
        {
          "type": "SYMBOL",
          "name": "macro_call"
        },
        {
          "type": "SYMBOL",
          "name": "_paren_group"
        },
        {
          "type": "SYMBOL",
          "name": "_bare_pct"
        },
        {
          "type": "PATTERN",
          "value": "[0-9]+(\\.[0-9]*)?([eE][+-]?[0-9]+)?"
        },
        {
          "type": "PATTERN",
          "value": "\\.[0-9]+([eE][+-]?[0-9]+)?"
        },
        {
          "type": "PATTERN",
          "value": "[^A-Za-z_0-9;()\\s\"'&%.]+"
        },
        {
          "type": "PATTERN",
          "value": "\\."
        }
      ]
    },
    "proc_step": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "proc_step_header"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_step_statement"
          }
        },
        {
          "type": "SYMBOL",
          "name": "run_or_quit_statement"
        }
      ]
    },
    "proc_step_header": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[pP][rR][oO][cC]"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_option_token"
          }
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "run_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[rR][uU][nN]"
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "run_or_quit_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "PATTERN",
              "value": "[rR][uU][nN]"
            },
            {
              "type": "PATTERN",
              "value": "[qQ][uU][iI][tT]"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "_step_statement": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "macro_definition"
        },
        {
          "type": "SYMBOL",
          "name": "macro_if_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_do_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_variable_assignment"
        },
        {
          "type": "SYMBOL",
          "name": "include_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_call_statement"
        },
        {
          "type": "SYMBOL",
          "name": "line_comment"
        },
        {
          "type": "SYMBOL",
          "name": "null_statement"
        },
        {
          "type": "SYMBOL",
          "name": "generic_statement"
        }
      ]
    },
    "null_statement": {
      "type": "PREC",
      "value": -1,
      "content": {
        "type": "STRING",
        "value": ";"
      }
    },
    "_data_body_statement": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "set_statement"
        },
        {
          "type": "SYMBOL",
          "name": "merge_statement"
        },
        {
          "type": "SYMBOL",
          "name": "update_statement"
        },
        {
          "type": "SYMBOL",
          "name": "output_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_definition"
        },
        {
          "type": "SYMBOL",
          "name": "macro_if_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_do_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_variable_assignment"
        },
        {
          "type": "SYMBOL",
          "name": "include_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_call_statement"
        },
        {
          "type": "SYMBOL",
          "name": "line_comment"
        },
        {
          "type": "SYMBOL",
          "name": "null_statement"
        },
        {
          "type": "SYMBOL",
          "name": "generic_statement"
        }
      ]
    },
    "set_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[sS][eE][tT]"
        },
        {
          "type": "REPEAT1",
          "content": {
            "type": "SYMBOL",
            "name": "_data_source"
          }
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "merge_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[mM][eE][rR][gG][eE]"
        },
        {
          "type": "REPEAT1",
          "content": {
            "type": "SYMBOL",
            "name": "_data_source"
          }
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "update_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[uU][pP][dD][aA][tT][eE]"
        },
        {
          "type": "REPEAT1",
          "content": {
            "type": "SYMBOL",
            "name": "_data_source"
          }
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "output_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[oO][uU][tT][pP][uU][tT]"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_data_source"
          }
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "_data_source": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "dataset_name"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "ds_options"
            },
            {
              "type": "BLANK"
            }
          ]
        }
      ]
    },
    "ds_options": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "string_literal"
              },
              {
                "type": "SYMBOL",
                "name": "macro_variable_ref"
              },
              {
                "type": "SYMBOL",
                "name": "_paren_group"
              },
              {
                "type": "PATTERN",
                "value": "[^();\"'&%]+"
              }
            ]
          }
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "macro_definition": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_pct_macro"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "macro_name"
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "macro_parameters"
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "macro_options"
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ";"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_macro_body_item"
          }
        },
        {
          "type": "SYMBOL",
          "name": "macro_end"
        }
      ]
    },
    "macro_parameters": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "_macro_param"
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SEQ",
                    "members": [
                      {
                        "type": "STRING",
                        "value": ","
                      },
                      {
                        "type": "SYMBOL",
                        "name": "_macro_param"
                      }
                    ]
                  }
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "_macro_param": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "identifier"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "STRING",
                  "value": "="
                },
                {
                  "type": "CHOICE",
                  "members": [
                    {
                      "type": "SYMBOL",
                      "name": "_macro_param_default"
                    },
                    {
                      "type": "BLANK"
                    }
                  ]
                }
              ]
            },
            {
              "type": "BLANK"
            }
          ]
        }
      ]
    },
    "_macro_param_default": {
      "type": "REPEAT1",
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SYMBOL",
            "name": "string_literal"
          },
          {
            "type": "SYMBOL",
            "name": "numeric_literal"
          },
          {
            "type": "SYMBOL",
            "name": "macro_variable_ref"
          },
          {
            "type": "SYMBOL",
            "name": "macro_call"
          },
          {
            "type": "SYMBOL",
            "name": "_paren_group"
          },
          {
            "type": "PATTERN",
            "value": "[^,();\\s\"'&%]+"
          }
        ]
      }
    },
    "_macro_body_item": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "data_step"
        },
        {
          "type": "SYMBOL",
          "name": "proc_sql_step"
        },
        {
          "type": "SYMBOL",
          "name": "proc_step"
        },
        {
          "type": "SYMBOL",
          "name": "macro_definition"
        },
        {
          "type": "SYMBOL",
          "name": "macro_if_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_do_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_variable_assignment"
        },
        {
          "type": "SYMBOL",
          "name": "include_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_call_statement"
        },
        {
          "type": "SYMBOL",
          "name": "macro_label"
        },
        {
          "type": "SYMBOL",
          "name": "line_comment"
        },
        {
          "type": "SYMBOL",
          "name": "null_statement"
        },
        {
          "type": "SYMBOL",
          "name": "generic_statement"
        },
        {
          "type": "PREC",
          "value": -1,
          "content": {
            "type": "SYMBOL",
            "name": "_mc_tok_inner"
          }
        }
      ]
    },
    "macro_end": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_pct_mend"
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "macro_name"
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "macro_if_statement": {
      "type": "PREC_RIGHT",
      "value": 0,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "SYMBOL",
            "name": "_pct_if"
          },
          {
            "type": "REPEAT",
            "content": {
              "type": "SYMBOL",
              "name": "_mc_tok_inner"
            }
          },
          {
            "type": "SYMBOL",
            "name": "_pct_then"
          },
          {
            "type": "SYMBOL",
            "name": "_macro_body_item"
          },
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "SEQ",
                "members": [
                  {
                    "type": "SYMBOL",
                    "name": "_pct_else"
                  },
                  {
                    "type": "SYMBOL",
                    "name": "_macro_body_item"
                  }
                ]
              },
              {
                "type": "BLANK"
              }
            ]
          }
        ]
      }
    },
    "macro_do_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_pct_do"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_mc_tok_inner"
          }
        },
        {
          "type": "STRING",
          "value": ";"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_macro_body_item"
          }
        },
        {
          "type": "SYMBOL",
          "name": "_pct_end"
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "macro_options": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "/"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_macro_option_token"
          }
        }
      ]
    },
    "_macro_option_token": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SEQ",
          "members": [
            {
              "type": "SYMBOL",
              "name": "identifier"
            },
            {
              "type": "STRING",
              "value": "="
            },
            {
              "type": "SYMBOL",
              "name": "string_literal"
            }
          ]
        },
        {
          "type": "SYMBOL",
          "name": "identifier"
        }
      ]
    },
    "macro_label": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "%"
        },
        {
          "type": "ALIAS",
          "content": {
            "type": "IMMEDIATE_TOKEN",
            "content": {
              "type": "PATTERN",
              "value": "[A-Za-z_][A-Za-z0-9_]*"
            }
          },
          "named": true,
          "value": "macro_name"
        },
        {
          "type": "STRING",
          "value": ":"
        }
      ]
    },
    "macro_name": {
      "type": "SYMBOL",
      "name": "identifier"
    },
    "macro_call_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "%"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "ALIAS",
            "content": {
              "type": "IMMEDIATE_TOKEN",
              "content": {
                "type": "PATTERN",
                "value": "[A-Za-z_][A-Za-z0-9_]*"
              }
            },
            "named": true,
            "value": "macro_name"
          }
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "PREC_RIGHT",
              "value": 0,
              "content": {
                "type": "SEQ",
                "members": [
                  {
                    "type": "SYMBOL",
                    "name": "macro_arguments"
                  },
                  {
                    "type": "CHOICE",
                    "members": [
                      {
                        "type": "STRING",
                        "value": ";"
                      },
                      {
                        "type": "BLANK"
                      }
                    ]
                  }
                ]
              }
            },
            {
              "type": "STRING",
              "value": ";"
            },
            {
              "type": "SEQ",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "_mc_tok"
                },
                {
                  "type": "REPEAT",
                  "content": {
                    "type": "SYMBOL",
                    "name": "_mc_tok_inner"
                  }
                },
                {
                  "type": "STRING",
                  "value": ";"
                }
              ]
            }
          ]
        }
      ]
    },
    "macro_call": {
      "type": "PREC_RIGHT",
      "value": 0,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "%"
          },
          {
            "type": "FIELD",
            "name": "name",
            "content": {
              "type": "ALIAS",
              "content": {
                "type": "IMMEDIATE_TOKEN",
                "content": {
                  "type": "PATTERN",
                  "value": "[A-Za-z_][A-Za-z0-9_]*"
                }
              },
              "named": true,
              "value": "macro_name"
            }
          },
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "macro_arguments"
              },
              {
                "type": "BLANK"
              }
            ]
          }
        ]
      }
    },
    "macro_arguments": {
      "type": "PREC",
      "value": 1,
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "STRING",
            "value": "("
          },
          {
            "type": "CHOICE",
            "members": [
              {
                "type": "SEQ",
                "members": [
                  {
                    "type": "SYMBOL",
                    "name": "_macro_arg"
                  },
                  {
                    "type": "REPEAT",
                    "content": {
                      "type": "SEQ",
                      "members": [
                        {
                          "type": "STRING",
                          "value": ","
                        },
                        {
                          "type": "SYMBOL",
                          "name": "_macro_arg"
                        }
                      ]
                    }
                  }
                ]
              },
              {
                "type": "BLANK"
              }
            ]
          },
          {
            "type": "STRING",
            "value": ")"
          }
        ]
      }
    },
    "_macro_arg": {
      "type": "REPEAT1",
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SYMBOL",
            "name": "string_literal"
          },
          {
            "type": "SYMBOL",
            "name": "numeric_literal"
          },
          {
            "type": "SYMBOL",
            "name": "macro_variable_ref"
          },
          {
            "type": "SYMBOL",
            "name": "macro_call"
          },
          {
            "type": "SYMBOL",
            "name": "_paren_group"
          },
          {
            "type": "PATTERN",
            "value": "[^,();\\s\"'&%]+"
          }
        ]
      }
    },
    "_paren_group": {
      "type": "SEQ",
      "members": [
        {
          "type": "STRING",
          "value": "("
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_paren_group_item"
          }
        },
        {
          "type": "STRING",
          "value": ")"
        }
      ]
    },
    "_paren_group_item": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "string_literal"
        },
        {
          "type": "SYMBOL",
          "name": "numeric_literal"
        },
        {
          "type": "SYMBOL",
          "name": "macro_variable_ref"
        },
        {
          "type": "SYMBOL",
          "name": "macro_call"
        },
        {
          "type": "SYMBOL",
          "name": "macro_do_statement"
        },
        {
          "type": "SYMBOL",
          "name": "_paren_group"
        },
        {
          "type": "PATTERN",
          "value": "[^();\"'&%]+"
        }
      ]
    },
    "_mc_tok": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "string_literal"
        },
        {
          "type": "SYMBOL",
          "name": "numeric_literal"
        },
        {
          "type": "SYMBOL",
          "name": "macro_variable_ref"
        },
        {
          "type": "SYMBOL",
          "name": "macro_call"
        },
        {
          "type": "PATTERN",
          "value": "&=[A-Za-z_][A-Za-z0-9_]*"
        },
        {
          "type": "PATTERN",
          "value": "[^;%()\\s\"'&]+"
        }
      ]
    },
    "_mc_tok_inner": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "string_literal"
        },
        {
          "type": "SYMBOL",
          "name": "numeric_literal"
        },
        {
          "type": "SYMBOL",
          "name": "macro_variable_ref"
        },
        {
          "type": "SYMBOL",
          "name": "macro_call"
        },
        {
          "type": "SYMBOL",
          "name": "_paren_group"
        },
        {
          "type": "SYMBOL",
          "name": "_bare_pct"
        },
        {
          "type": "PATTERN",
          "value": "&=[A-Za-z_][A-Za-z0-9_]*"
        },
        {
          "type": "PATTERN",
          "value": "[^;%()\\s\"'&]+"
        }
      ]
    },
    "macro_variable_assignment": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_pct_let"
        },
        {
          "type": "FIELD",
          "name": "name",
          "content": {
            "type": "SYMBOL",
            "name": "_let_name"
          }
        },
        {
          "type": "STRING",
          "value": "="
        },
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "FIELD",
              "name": "value",
              "content": {
                "type": "SYMBOL",
                "name": "_macro_value"
              }
            },
            {
              "type": "BLANK"
            }
          ]
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "_let_name": {
      "type": "SEQ",
      "members": [
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "identifier"
            },
            {
              "type": "SYMBOL",
              "name": "macro_variable_ref"
            }
          ]
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "macro_variable_ref"
          }
        }
      ]
    },
    "_macro_value": {
      "type": "REPEAT1",
      "content": {
        "type": "CHOICE",
        "members": [
          {
            "type": "SYMBOL",
            "name": "string_literal"
          },
          {
            "type": "SYMBOL",
            "name": "numeric_literal"
          },
          {
            "type": "SYMBOL",
            "name": "macro_variable_ref"
          },
          {
            "type": "SYMBOL",
            "name": "macro_call"
          },
          {
            "type": "PATTERN",
            "value": "[^;]+"
          }
        ]
      }
    },
    "include_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "SYMBOL",
          "name": "_pct_include"
        },
        {
          "type": "FIELD",
          "name": "source",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "string_literal"
              },
              {
                "type": "SYMBOL",
                "name": "fileref_source"
              }
            ]
          }
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_option_token"
          }
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "fileref_source": {
      "type": "PATTERN",
      "value": "[A-Za-z_][A-Za-z0-9_]*(\\([A-Za-z_][A-Za-z0-9_.]+\\))?"
    },
    "libname_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[lL][iI][bB][nN][aA][mM][eE]"
        },
        {
          "type": "FIELD",
          "name": "libref",
          "content": {
            "type": "SYMBOL",
            "name": "identifier"
          }
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_libname_token"
          }
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "_libname_token": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "string_literal"
        },
        {
          "type": "SYMBOL",
          "name": "macro_variable_ref"
        },
        {
          "type": "PATTERN",
          "value": "[^;\\s\"'&%]+"
        }
      ]
    },
    "options_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "PATTERN",
          "value": "[oO][pP][tT][iI][oO][nN][sS]"
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "SYMBOL",
            "name": "_option_token"
          }
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "_option_token": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SYMBOL",
          "name": "string_literal"
        },
        {
          "type": "SYMBOL",
          "name": "macro_variable_ref"
        },
        {
          "type": "PATTERN",
          "value": "[^;\\/\\s\"'&%]+"
        },
        {
          "type": "PATTERN",
          "value": "=\\s*"
        }
      ]
    },
    "generic_statement": {
      "type": "SEQ",
      "members": [
        {
          "type": "CHOICE",
          "members": [
            {
              "type": "SYMBOL",
              "name": "string_literal"
            },
            {
              "type": "SYMBOL",
              "name": "numeric_literal"
            },
            {
              "type": "SYMBOL",
              "name": "macro_variable_ref"
            },
            {
              "type": "PATTERN",
              "value": "[^();%\\/\\s\"'&]+"
            },
            {
              "type": "PATTERN",
              "value": "\\/"
            }
          ]
        },
        {
          "type": "REPEAT",
          "content": {
            "type": "CHOICE",
            "members": [
              {
                "type": "SYMBOL",
                "name": "string_literal"
              },
              {
                "type": "SYMBOL",
                "name": "numeric_literal"
              },
              {
                "type": "SYMBOL",
                "name": "macro_variable_ref"
              },
              {
                "type": "SYMBOL",
                "name": "macro_call"
              },
              {
                "type": "SYMBOL",
                "name": "_bare_pct"
              },
              {
                "type": "PATTERN",
                "value": "[^;%\\/\\s\"'&]+"
              },
              {
                "type": "PATTERN",
                "value": "\\/"
              }
            ]
          }
        },
        {
          "type": "STRING",
          "value": ";"
        }
      ]
    },
    "macro_variable_ref": {
      "type": "TOKEN",
      "content": {
        "type": "SEQ",
        "members": [
          {
            "type": "PATTERN",
            "value": "&+"
          },
          {
            "type": "PATTERN",
            "value": "[A-Za-z_][A-Za-z0-9_]*"
          },
          {
            "type": "REPEAT",
            "content": {
              "type": "CHOICE",
              "members": [
                {
                  "type": "PATTERN",
                  "value": "\\.[A-Za-z_][A-Za-z0-9_]*"
                },
                {
                  "type": "PATTERN",
                  "value": "\\."
                }
              ]
            }
          }
        ]
      }
    },
    "identifier": {
      "type": "PATTERN",
      "value": "[A-Za-z_][A-Za-z0-9_]*"
    },
    "string_literal": {
      "type": "CHOICE",
      "members": [
        {
          "type": "SEQ",
          "members": [
            {
              "type": "TOKEN",
              "content": {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": "'"
                  },
                  {
                    "type": "REPEAT",
                    "content": {
                      "type": "CHOICE",
                      "members": [
                        {
                          "type": "PATTERN",
                          "value": "[^']+"
                        },
                        {
                          "type": "STRING",
                          "value": "''"
                        }
                      ]
                    }
                  },
                  {
                    "type": "STRING",
                    "value": "'"
                  }
                ]
              }
            },
            {
              "type": "CHOICE",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "_string_suffix"
                },
                {
                  "type": "BLANK"
                }
              ]
            }
          ]
        },
        {
          "type": "SEQ",
          "members": [
            {
              "type": "TOKEN",
              "content": {
                "type": "SEQ",
                "members": [
                  {
                    "type": "STRING",
                    "value": "\""
                  },
                  {
                    "type": "REPEAT",
                    "content": {
                      "type": "CHOICE",
                      "members": [
                        {
                          "type": "PATTERN",
                          "value": "%\""
                        },
                        {
                          "type": "PATTERN",
                          "value": "[^\"]+"
                        },
                        {
                          "type": "STRING",
                          "value": "\"\""
                        }
                      ]
                    }
                  },
                  {
                    "type": "STRING",
                    "value": "\""
                  }
                ]
              }
            },
            {
              "type": "CHOICE",
              "members": [
                {
                  "type": "SYMBOL",
                  "name": "_string_suffix"
                },
                {
                  "type": "BLANK"
                }
              ]
            }
          ]
        }
      ]
    },
    "_string_suffix": {
      "type": "IMMEDIATE_TOKEN",
      "content": {
        "type": "PATTERN",
        "value": "[BbDdNnTtXx][Tt]?"
      }
    },
    "numeric_literal": {
      "type": "TOKEN",
      "content": {
        "type": "PREC",
        "value": 1,
        "content": {
          "type": "CHOICE",
          "members": [
            {
              "type": "PATTERN",
              "value": "[0-9]+(\\.[0-9]*)?([eE][+-]?[0-9]+)?"
            },
            {
              "type": "PATTERN",
              "value": "\\.[0-9]+([eE][+-]?[0-9]+)?"
            },
            {
              "type": "PATTERN",
              "value": "[0-9A-Fa-f]+[Xx]"
            }
          ]
        }
      }
    }
  },
  "extras": [
    {
      "type": "PATTERN",
      "value": "\\s+"
    },
    {
      "type": "SYMBOL",
      "name": "block_comment"
    },
    {
      "type": "SYMBOL",
      "name": "percent_comment"
    }
  ],
  "conflicts": [
    [
      "generic_statement",
      "_mc_tok_inner"
    ],
    [
      "macro_call_statement",
      "macro_call"
    ]
  ],
  "precedences": [],
  "externals": [
    {
      "type": "SYMBOL",
      "name": "_pct_let"
    },
    {
      "type": "SYMBOL",
      "name": "_pct_macro"
    },
    {
      "type": "SYMBOL",
      "name": "_pct_mend"
    },
    {
      "type": "SYMBOL",
      "name": "_pct_include"
    },
    {
      "type": "SYMBOL",
      "name": "_bare_pct"
    },
    {
      "type": "SYMBOL",
      "name": "_pct_if"
    },
    {
      "type": "SYMBOL",
      "name": "_pct_then"
    },
    {
      "type": "SYMBOL",
      "name": "_pct_else"
    },
    {
      "type": "SYMBOL",
      "name": "_pct_do"
    },
    {
      "type": "SYMBOL",
      "name": "_pct_end"
    }
  ],
  "inline": [],
  "supertypes": []
}
