{
"$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": []
}