UNPKG

tree-sitter-frisc

Version:
859 lines (857 loc) 16.5 kB
{ "name": "frisc", "rules": { "source_file": { "type": "REPEAT", "content": { "type": "SYMBOL", "name": "_statement" } }, "_statement": { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "label" }, { "type": "BLANK" } ] }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "alu_operation" }, { "type": "SYMBOL", "name": "compare" }, { "type": "SYMBOL", "name": "move" }, { "type": "SYMBOL", "name": "_memory_operation" }, { "type": "SYMBOL", "name": "_control_operation" }, { "type": "SYMBOL", "name": "_preprocessor" } ] } ] }, "comment": { "type": "TOKEN", "content": { "type": "PATTERN", "value": ";[^\\r\\n]*" } }, "alu_operation": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "_alu_mnemonic" }, { "type": "SYMBOL", "name": "_src1" }, { "type": "STRING", "value": "," }, { "type": "SYMBOL", "name": "_src2" }, { "type": "STRING", "value": "," }, { "type": "SYMBOL", "name": "_dest" } ] }, "compare": { "type": "SEQ", "members": [ { "type": "STRING", "value": "CMP" }, { "type": "SYMBOL", "name": "_src1" }, { "type": "STRING", "value": "," }, { "type": "SYMBOL", "name": "_src2" } ] }, "move": { "type": "SEQ", "members": [ { "type": "STRING", "value": "MOVE" }, { "type": "SYMBOL", "name": "_src2" }, { "type": "STRING", "value": "," }, { "type": "SYMBOL", "name": "_dest" } ] }, "_memory_operation": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "load" }, { "type": "SYMBOL", "name": "store" }, { "type": "SYMBOL", "name": "stack_operation" } ] }, "_control_operation": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "jump" }, { "type": "SYMBOL", "name": "jump_relative" }, { "type": "SYMBOL", "name": "call" }, { "type": "SYMBOL", "name": "ret" }, { "type": "SYMBOL", "name": "halt" } ] }, "_preprocessor": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "org" }, { "type": "SYMBOL", "name": "define_memory" }, { "type": "SYMBOL", "name": "equ" } ] }, "org": { "type": "SEQ", "members": [ { "type": "STRING", "value": "ORG" }, { "type": "SYMBOL", "name": "number" } ] }, "define_memory": { "type": "SEQ", "members": [ { "type": "PATTERN", "value": "D[WHBS]" }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "_numbers" }, { "type": "SYMBOL", "name": "string_literal" } ] } ] }, "equ": { "type": "SEQ", "members": [ { "type": "STRING", "value": "EQU" }, { "type": "SYMBOL", "name": "number" } ] }, "jump": { "type": "SEQ", "members": [ { "type": "STRING", "value": "JP" }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "condition" }, { "type": "BLANK" } ] }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "immediate" }, { "type": "SEQ", "members": [ { "type": "STRING", "value": "(" }, { "type": "SYMBOL", "name": "register" }, { "type": "STRING", "value": ")" } ] } ] } ] }, "jump_relative": { "type": "SEQ", "members": [ { "type": "STRING", "value": "JR" }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "condition" }, { "type": "BLANK" } ] }, { "type": "SYMBOL", "name": "immediate" } ] }, "call": { "type": "SEQ", "members": [ { "type": "STRING", "value": "CALL" }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "condition" }, { "type": "BLANK" } ] }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "immediate" }, { "type": "SEQ", "members": [ { "type": "STRING", "value": "(" }, { "type": "SYMBOL", "name": "register" }, { "type": "STRING", "value": ")" } ] } ] } ] }, "ret": { "type": "SEQ", "members": [ { "type": "PATTERN", "value": "RET[IN]?" }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "condition" }, { "type": "BLANK" } ] } ] }, "halt": { "type": "SEQ", "members": [ { "type": "STRING", "value": "HALT" }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "condition" }, { "type": "BLANK" } ] } ] }, "condition": { "type": "SEQ", "members": [ { "type": "STRING", "value": "_" }, { "type": "CHOICE", "members": [ { "type": "STRING", "value": "C" }, { "type": "STRING", "value": "NC" }, { "type": "STRING", "value": "V" }, { "type": "STRING", "value": "NV" }, { "type": "STRING", "value": "N" }, { "type": "STRING", "value": "NN" }, { "type": "STRING", "value": "M" }, { "type": "STRING", "value": "P" }, { "type": "STRING", "value": "Z" }, { "type": "STRING", "value": "NZ" }, { "type": "STRING", "value": "EQ" }, { "type": "STRING", "value": "NE" }, { "type": "STRING", "value": "ULE" }, { "type": "STRING", "value": "UGT" }, { "type": "STRING", "value": "ULT" }, { "type": "STRING", "value": "UGE" }, { "type": "STRING", "value": "SLE" }, { "type": "STRING", "value": "SGT" }, { "type": "STRING", "value": "SLT" }, { "type": "STRING", "value": "SGE" } ] } ] }, "load": { "type": "SEQ", "members": [ { "type": "PATTERN", "value": "LOAD[BH]?" }, { "type": "SYMBOL", "name": "_dest" }, { "type": "STRING", "value": "," }, { "type": "STRING", "value": "(" }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "immediate" }, { "type": "SYMBOL", "name": "reg_offset" } ] }, { "type": "STRING", "value": ")" } ] }, "store": { "type": "SEQ", "members": [ { "type": "PATTERN", "value": "STORE[BH]?" }, { "type": "SYMBOL", "name": "_src1" }, { "type": "STRING", "value": "," }, { "type": "STRING", "value": "(" }, { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "immediate" }, { "type": "SYMBOL", "name": "reg_offset" } ] }, { "type": "STRING", "value": ")" } ] }, "reg_offset": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "register" }, { "type": "CHOICE", "members": [ { "type": "SEQ", "members": [ { "type": "STRING", "value": "+" }, { "type": "SYMBOL", "name": "number" } ] }, { "type": "BLANK" } ] } ] }, "stack_operation": { "type": "SEQ", "members": [ { "type": "CHOICE", "members": [ { "type": "STRING", "value": "POP" }, { "type": "STRING", "value": "PUSH" } ] }, { "type": "SYMBOL", "name": "register" } ] }, "_alu_mnemonic": { "type": "TOKEN", "content": { "type": "CHOICE", "members": [ { "type": "STRING", "value": "ADD" }, { "type": "STRING", "value": "ADC" }, { "type": "STRING", "value": "SUB" }, { "type": "STRING", "value": "SBC" }, { "type": "STRING", "value": "AND" }, { "type": "STRING", "value": "OR" }, { "type": "STRING", "value": "XOR" }, { "type": "STRING", "value": "SHL" }, { "type": "STRING", "value": "SHR" }, { "type": "STRING", "value": "ASHR" }, { "type": "STRING", "value": "ROTL" }, { "type": "STRING", "value": "ROTR" } ] } }, "_src1": { "type": "SYMBOL", "name": "register" }, "_src2": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "register" }, { "type": "SYMBOL", "name": "immediate" } ] }, "_dest": { "type": "SYMBOL", "name": "register" }, "register": { "type": "CHOICE", "members": [ { "type": "PATTERN", "value": "R[0-7]" }, { "type": "STRING", "value": "SP" }, { "type": "STRING", "value": "SR" }, { "type": "STRING", "value": "PC" } ] }, "immediate": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "label" }, { "type": "SYMBOL", "name": "number" } ] }, "label": { "type": "TOKEN", "content": { "type": "PREC", "value": -1, "content": { "type": "PATTERN", "value": "[a-zA-Z]\\w*" } } }, "_numbers": { "type": "SEQ", "members": [ { "type": "SYMBOL", "name": "number" }, { "type": "REPEAT", "content": { "type": "SEQ", "members": [ { "type": "STRING", "value": "," }, { "type": "SYMBOL", "name": "number" } ] } } ] }, "number": { "type": "CHOICE", "members": [ { "type": "SYMBOL", "name": "dec" }, { "type": "SYMBOL", "name": "bin" }, { "type": "SYMBOL", "name": "oct" }, { "type": "SYMBOL", "name": "hex" } ] }, "string_literal": { "type": "SEQ", "members": [ { "type": "STRING", "value": "\"" }, { "type": "IMMEDIATE_TOKEN", "content": { "type": "PREC", "value": 1, "content": { "type": "PATTERN", "value": "[^\\\\\"\\n]+" } } }, { "type": "STRING", "value": "\"" } ] }, "dec": { "type": "PATTERN", "value": "%D -?[0-9]+" }, "bin": { "type": "PATTERN", "value": "%B -?[01]+" }, "oct": { "type": "PATTERN", "value": "%O -?[0-7]+" }, "hex": { "type": "CHOICE", "members": [ { "type": "PATTERN", "value": "-?[0-9][0-9a-fA-F]*" }, { "type": "PATTERN", "value": "%H -?[0-9a-fA-F]+" } ] } }, "extras": [ { "type": "PATTERN", "value": "\\s" }, { "type": "SYMBOL", "name": "comment" } ], "conflicts": [], "externals": [], "inline": [], "supertypes": [] }