tree-sitter-frisc
Version:
FRISC grammar for tree-sitter
859 lines (857 loc) • 16.5 kB
JSON
{
"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": []
}