UNPKG

tree-sitter-mips

Version:

A syntax parser for the MIPS Instruction Set Architecture.

1,976 lines (1,975 loc) 46.5 kB
{ "$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json", "name": "mips", "rules": { "program": { "type": "SEQ", "members": [ { "type": "REPEAT", "content": { "type": "SYMBOL", "name": "_statement" } }, { "type": "CHOICE", "members": [ { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "directive" }, { "type": "SYMBOL", "name": "instruction" }, { "type": "SYMBOL", "name": "_label" } ] }, { "type": "BLANK" } ] }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "comment" }, { "type": "BLANK" } ] } ] }, "_statement": { "type": "PREC", "value": 1, "content": { "type": "CHOICE", "members": [ { "type": "STRING", "value": ";" }, { "type": "STRING", "value": "\r" }, { "type": "STRING", "value": "\n" }, { "type": "CHOICE", "members": [ { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "directive" }, { "type": "CHOICE", "members": [ { "type": "STRING", "value": ";" }, { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "comment" }, { "type": "BLANK" } ] }, { "type": "SYMBOL", "name": "_line_separator" } ] } ] } ] }, { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "instruction" }, { "type": "CHOICE", "members": [ { "type": "STRING", "value": ";" }, { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "comment" }, { "type": "BLANK" } ] }, { "type": "CHOICE", "members": [ { "type": "STRING", "value": "\r" }, { "type": "BLANK" } ] }, { "type": "STRING", "value": "\n" } ] } ] } ] } ] }, { "type": "SYMBOL", "name": "_label" }, { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "comment" }, { "type": "CHOICE", "members": [ { "type": "STRING", "value": "\r" }, { "type": "BLANK" } ] }, { "type": "STRING", "value": "\n" } ] } ] } }, "comment": { "type": "PATTERN", "value": "#.*" }, "_whitespace": { "type": "PATTERN", "value": "[ \\t]+" }, "_directive_operand_separator": { "type": "CHOICE", "members": [ { "type": "PATTERN", "value": "[ \\t]+" }, { "type": "PATTERN", "value": "[ \\t]*,[ \\t]*" } ] }, "directive": { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "_macro_directive" }, { "type": "SYMBOL", "name": "_integer_directive" }, { "type": "SYMBOL", "name": "_float_directive" }, { "type": "SYMBOL", "name": "_string_directive" }, { "type": "SYMBOL", "name": "_control_directive" } ] } ] }, "_macro_directive": { "type": "SEQ", "members": [ { "type": "FIELD", "name": "mnemonic", "content": { "type": "SYMBOL", "name": "macro_mnemonic" } }, { "type": "SYMBOL", "name": "_whitespace" }, { "type": "FIELD", "name": "name", "content": { "type": "SYMBOL", "name": "symbol" } }, { "type": "CHOICE", "members": [ { "type": "CHOICE", "members": [ { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "_whitespace" }, { "type": "BLANK" } ] }, { "type": "STRING", "value": "(" }, { "type": "CHOICE", "members": [ { "type": "FIELD", "name": "parameters", "content": { "type": "SYMBOL", "name": "macro_parameters" } }, { "type": "BLANK" } ] }, { "type": "CHOICE", "members": [ { "type": "CHOICE", "members": [ { "type": "STRING", "value": " " }, { "type": "STRING", "value": "\t" } ] }, { "type": "BLANK" } ] }, { "type": "STRING", "value": ")" } ] }, { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_whitespace" }, { "type": "FIELD", "name": "parameters", "content": { "type": "SYMBOL", "name": "macro_parameters" } } ] } ] }, { "type": "BLANK" } ] } ] }, "macro_mnemonic": { "type": "STRING", "value": ".macro" }, "macro_parameters": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_macro_parameter" }, { "type": "REPEAT", "content": { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "STRING", "value": " " }, { "type": "STRING", "value": "\t" }, { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "CHOICE", "members": [ { "type": "STRING", "value": " " }, { "type": "STRING", "value": "\t" } ] }, { "type": "BLANK" } ] }, { "type": "STRING", "value": "," } ] } ] }, { "type": "SYMBOL", "name": "_macro_parameter" } ] } } ] }, "_macro_parameter": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "macro_variable" }, { "type": "SYMBOL", "name": "symbol" } ] }, "_integer_directive": { "type": "SEQ", "members": [ { "type": "FIELD", "name": "mnemonic", "content": { "type": "SYMBOL", "name": "integer_mnemonic" } }, { "type": "SYMBOL", "name": "_whitespace" }, { "type": "FIELD", "name": "operands", "content": { "type": "SYMBOL", "name": "integer_operands" } }, { "type": "CHOICE", "members": [ { "type": "REPEAT", "content": { "type": "CHOICE", "members": [ { "type": "STRING", "value": "\r" }, { "type": "STRING", "value": "\n" }, { "type": "STRING", "value": " " }, { "type": "STRING", "value": "\t" } ] } }, { "type": "BLANK" } ] } ] }, "integer_mnemonic": { "type": "CHOICE", "members": [ { "type": "STRING", "value": ".word" }, { "type": "STRING", "value": ".half" }, { "type": "STRING", "value": ".hword" }, { "type": "STRING", "value": ".byte" }, { "type": "STRING", "value": ".dword" } ] }, "integer_operands": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_expression" }, { "type": "REPEAT", "content": { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "STRING", "value": " " }, { "type": "STRING", "value": "\t" }, { "type": "PATTERN", "value": "[ \\t]*,[ \\t]*" }, { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "CHOICE", "members": [ { "type": "STRING", "value": " " }, { "type": "STRING", "value": "\t" } ] }, { "type": "BLANK" } ] }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "comment" }, { "type": "BLANK" } ] }, { "type": "SYMBOL", "name": "_data_separator" } ] } ] }, { "type": "SYMBOL", "name": "_expression" } ] } }, { "type": "CHOICE", "members": [ { "type": "REPEAT", "content": { "type": "SYMBOL", "name": "_data_separator" } }, { "type": "BLANK" } ] } ] }, "_float_directive": { "type": "SEQ", "members": [ { "type": "FIELD", "name": "mnemonic", "content": { "type": "SYMBOL", "name": "float_mnemonic" } }, { "type": "SYMBOL", "name": "_whitespace" }, { "type": "FIELD", "name": "operands", "content": { "type": "SYMBOL", "name": "float_operands" } }, { "type": "CHOICE", "members": [ { "type": "REPEAT", "content": { "type": "CHOICE", "members": [ { "type": "STRING", "value": "\r" }, { "type": "STRING", "value": "\n" }, { "type": "STRING", "value": " " }, { "type": "STRING", "value": "\t" } ] } }, { "type": "BLANK" } ] } ] }, "float_mnemonic": { "type": "CHOICE", "members": [ { "type": "STRING", "value": ".float" }, { "type": "STRING", "value": ".double" } ] }, "float_operands": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "float" }, { "type": "REPEAT", "content": { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "STRING", "value": " " }, { "type": "STRING", "value": "\t" }, { "type": "PATTERN", "value": "[ \\t]*,[ \\t]*" }, { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "CHOICE", "members": [ { "type": "STRING", "value": " " }, { "type": "STRING", "value": "\t" } ] }, { "type": "BLANK" } ] }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "comment" }, { "type": "BLANK" } ] }, { "type": "SYMBOL", "name": "_data_separator" } ] } ] }, { "type": "SYMBOL", "name": "float" } ] } }, { "type": "CHOICE", "members": [ { "type": "REPEAT", "content": { "type": "SYMBOL", "name": "_data_separator" } }, { "type": "BLANK" } ] } ] }, "_float_operand": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "float" }, { "type": "SYMBOL", "name": "macro_variable" } ] }, "_string_directive": { "type": "SEQ", "members": [ { "type": "FIELD", "name": "mnemonic", "content": { "type": "SYMBOL", "name": "string_mnemonic" } }, { "type": "SYMBOL", "name": "_whitespace" }, { "type": "FIELD", "name": "string", "content": { "type": "SYMBOL", "name": "_string_operand" } }, { "type": "PATTERN", "value": "[ \\t]*" } ] }, "string_mnemonic": { "type": "CHOICE", "members": [ { "type": "STRING", "value": ".ascii" }, { "type": "STRING", "value": ".asciiz" }, { "type": "STRING", "value": ".string" } ] }, "_string_operand": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "string" }, { "type": "SYMBOL", "name": "macro_variable" } ] }, "_control_directive": { "type": "SEQ", "members": [ { "type": "FIELD", "name": "mnemonic", "content": { "type": "SYMBOL", "name": "control_mnemonic" } }, { "type": "CHOICE", "members": [ { "type": "CHOICE", "members": [ { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_whitespace" }, { "type": "FIELD", "name": "operands", "content": { "type": "SYMBOL", "name": "control_operands" } }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "_directive_operand_separator" }, { "type": "BLANK" } ] } ] }, { "type": "PATTERN", "value": "[ \\t]+" } ] }, { "type": "BLANK" } ] } ] }, "control_mnemonic": { "type": "PREC", "value": -1, "content": { "type": "PATTERN", "value": "\\.[a-z_]+" } }, "control_operands": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_control_operand" }, { "type": "REPEAT", "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_directive_operand_separator" }, { "type": "SYMBOL", "name": "_control_operand" } ] } } ] }, "_control_operand": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "_expression" }, { "type": "SYMBOL", "name": "string" } ] }, "instruction": { "type": "SEQ", "members": [ { "type": "FIELD", "name": "opcode", "content": { "type": "SYMBOL", "name": "opcode" } }, { "type": "CHOICE", "members": [ { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "_call_expression" }, { "type": "SEQ", "members": [ { "type": "PATTERN", "value": "[ \\t]+" }, { "type": "CHOICE", "members": [ { "type": "FIELD", "name": "operands", "content": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "operands" }, { "type": "SYMBOL", "name": "_call_expression" } ] } }, { "type": "BLANK" } ] } ] } ] }, { "type": "BLANK" } ] } ] }, "opcode": { "type": "TOKEN", "content": { "type": "PREC", "value": 1, "content": { "type": "PATTERN", "value": "[a-zA-Z_][a-zA-Z0-9_.]*" } } }, "operands": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_operand" }, { "type": "REPEAT", "content": { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "STRING", "value": "," }, { "type": "SYMBOL", "name": "_operand_separator" } ] }, { "type": "SYMBOL", "name": "_operand" } ] } }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "_operand_separator" }, { "type": "BLANK" } ] } ] }, "_operand": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "address" }, { "type": "SYMBOL", "name": "_expression" }, { "type": "SYMBOL", "name": "float" }, { "type": "SYMBOL", "name": "string" }, { "type": "SYMBOL", "name": "modulo" } ] }, "_call_expression": { "type": "SEQ", "members": [ { "type": "STRING", "value": "(" }, { "type": "CHOICE", "members": [ { "type": "FIELD", "name": "arguments", "content": { "type": "SYMBOL", "name": "operands" } }, { "type": "BLANK" } ] }, { "type": "STRING", "value": ")" } ] }, "modulo": { "type": "TOKEN", "content": { "type": "PREC", "value": -1, "content": { "type": "STRING", "value": "%" } } }, "_expression": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "binary_expression" }, { "type": "SYMBOL", "name": "unary_expression" }, { "type": "SYMBOL", "name": "parenthesized_expression" }, { "type": "SYMBOL", "name": "macro_variable" }, { "type": "SYMBOL", "name": "register" }, { "type": "SYMBOL", "name": "symbol" }, { "type": "SYMBOL", "name": "char" }, { "type": "SYMBOL", "name": "octal" }, { "type": "SYMBOL", "name": "decimal" }, { "type": "SYMBOL", "name": "hexadecimal" } ] }, "binary_expression": { "type": "CHOICE", "members": [ { "type": "PREC_LEFT", "value": 1, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "||" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 2, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "&&" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 3, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "|" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 4, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "^" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 5, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "&" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 6, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "==" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 6, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "!=" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 7, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "<" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 7, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": ">" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 7, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "<=" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 7, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": ">=" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 8, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "<<" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 8, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": ">>" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 9, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "+" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 9, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "-" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 10, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "*" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 10, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "/" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 10, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "%" }, { "type": "SYMBOL", "name": "_right_expression" } ] } }, { "type": "PREC_LEFT", "value": 20, "content": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_left_expression" }, { "type": "STRING", "value": "=" }, { "type": "SYMBOL", "name": "_right_expression" } ] } } ] }, "_left_expression": { "type": "PREC", "value": 1, "content": { "type": "SEQ", "members": [ { "type": "FIELD", "name": "left", "content": { "type": "SYMBOL", "name": "_expression" } }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "_operator_separator" }, { "type": "BLANK" } ] } ] } }, "_right_expression": { "type": "FIELD", "name": "right", "content": { "type": "SYMBOL", "name": "_expression" } }, "parenthesized_expression": { "type": "SEQ", "members": [ { "type": "STRING", "value": "(" }, { "type": "SYMBOL", "name": "_expression_argument" }, { "type": "STRING", "value": ")" } ] }, "unary_expression": { "type": "CHOICE", "members": [ { "type": "PREC_RIGHT", "value": 11, "content": { "type": "SEQ", "members": [ { "type": "STRING", "value": "-" }, { "type": "SYMBOL", "name": "_expression_argument" } ] } }, { "type": "PREC_RIGHT", "value": 11, "content": { "type": "SEQ", "members": [ { "type": "STRING", "value": "~" }, { "type": "SYMBOL", "name": "_expression_argument" } ] } }, { "type": "PREC_RIGHT", "value": 11, "content": { "type": "SEQ", "members": [ { "type": "STRING", "value": "!" }, { "type": "SYMBOL", "name": "_expression_argument" } ] } } ] }, "_expression_argument": { "type": "FIELD", "name": "argument", "content": { "type": "SYMBOL", "name": "_expression" } }, "char": { "type": "PATTERN", "value": "'(?:\\\\.|[^'\\\\])'" }, "string": { "type": "PATTERN", "value": "\"(?:\\\\.|[^\"\\\\])*\"" }, "octal": { "type": "PATTERN", "value": "-?0[0-7]*" }, "decimal": { "type": "PATTERN", "value": "-?\\d+" }, "hexadecimal": { "type": "PATTERN", "value": "-?0[xX][0-9a-fA-F]+" }, "float": { "type": "TOKEN", "content": { "type": "CHOICE", "members": [ { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "PATTERN", "value": "-?\\d+\\.?\\d*" }, { "type": "PATTERN", "value": "-?\\d*\\.\\d+" } ] }, { "type": "CHOICE", "members": [ { "type": "PATTERN", "value": "[eE][+-]?\\d+" }, { "type": "BLANK" } ] } ] }, { "type": "PATTERN", "value": "-?\\d+[eE][+-]?\\d+" } ] } }, "register": { "type": "TOKEN", "content": { "type": "SEQ", "members": [ { "type": "STRING", "value": "$" }, { "type": "CHOICE", "members": [ { "type": "STRING", "value": "zero" }, { "type": "STRING", "value": "at" }, { "type": "STRING", "value": "gp" }, { "type": "STRING", "value": "sp" }, { "type": "STRING", "value": "fp" }, { "type": "STRING", "value": "ra" }, { "type": "PATTERN", "value": "[vk][01]" }, { "type": "PATTERN", "value": "[ac][0-3]" }, { "type": "PATTERN", "value": "t[0-9]" }, { "type": "PATTERN", "value": "s[0-8]" }, { "type": "PATTERN", "value": "f?([12]?[0-9]|3[0-1])" } ] } ] } }, "macro_variable": { "type": "PATTERN", "value": "[%$\\\\][0-9a-zA-Z_:$%\\\\]+" }, "symbol": { "type": "PATTERN", "value": "[a-zA-Z_][a-zA-Z0-9_]*" }, "_label": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "label" }, { "type": "PATTERN", "value": "[ \\t]*" } ] }, "label": { "type": "TOKEN", "content": { "type": "PREC", "value": 2, "content": { "type": "PATTERN", "value": "[a-zA-Z_][a-zA-Z0-9_]*:" } } }, "address": { "type": "PREC", "value": 1, "content": { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "FIELD", "name": "offset", "content": { "type": "SYMBOL", "name": "_expression" } }, { "type": "BLANK" } ] }, { "type": "STRING", "value": "(" }, { "type": "FIELD", "name": "base", "content": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "register" }, { "type": "SYMBOL", "name": "macro_variable" } ] } }, { "type": "STRING", "value": ")" } ] } } }, "extras": [ { "type": "PATTERN", "value": "[ \\t\\r]" }, { "type": "SYMBOL", "name": "comment" } ], "conflicts": [ [ "macro_parameters" ], [ "control_operands" ], [ "integer_operands" ], [ "float_operands" ], [ "_operand", "_expression_argument" ] ], "precedences": [], "externals": [ { "type": "SYMBOL", "name": "_operand_separator" }, { "type": "SYMBOL", "name": "_operator_separator" }, { "type": "SYMBOL", "name": "_line_separator" }, { "type": "SYMBOL", "name": "_data_separator" } ], "inline": [], "supertypes": [] }