expression → term term → factor ( ( "-" | "+" ) factor )* factor → unary ( ( "/" | "*" | "%" ) unary )* unary → ( "~" | "+" | "-" ) unary | shift shift → andl ( ( "<<" | ">>" ) andl )* andl → orl ( "&" orl )* orl → andl ( ( "|" | "^" ) andl )* primary → number | "(" expression ")" number → "%" base2-number | "$" base16-number | "0b" base2-number | "0x" base16-number | base10-number imm → ("#")? expression uimm8 → imm uimm19 → imm uimm25 → imm alu → and | or | xor | add | sub | ad2 | sr | rr | sl | rl | rl8 xy_src → "mc0" | "mc1" | "mc2" | "mc3" | "m0" | "m1" | "m2" | "m3" mov_ram_x → "mov" xy_src "," "x" mov_mul_p → "mov" "mul" "," "p" mov_ram_p → "mov" xy_src "," "p" x_bus → mov_ram_x | mov_mul_p | mov_ram_p mov_ram_y → "mov" xy_src "," "y" clr_a → "clr" "a" mov_alu_a → "mov" "alu" "," "a" mov_ram_a → "mov" xy_src "," "a" y_bus → mov_ram_y | clr_a | mpv_alu_a | mov_ram_a d1_dest → "rx" | "pl" | "ra0" | "wa0" | "lop" | "top" | "ct0" | "ct1" | "ct2" | "ct3" d1_src → "mc0" | "mc1" | "mc2" | "mc3" | "m0" | "m1" | "m2" | "m3" | "alh" | "all" mov_imm_d1 → "mov" uimm8 "," d1_dest mov_ram_d1 → "mov" d1_src "," d1_dest d1_bus → mov_imm_d1 → mov_ram_d1 nop → "nop" op → ( nop | alu | x_bus | y_bus | d1_bus ) + load_dest → "mc0" | "mc1" | "mc2" | "mc3" | "rx" | "pl" | "ra0" | "wa0" | "lop" | "pc" load_cond → "z" | "nz" | "s" | "ns" | "c" | "nc" | "t0" | "nt0" | "zs" | "nzs" mvi → "mvi" uimm25 load_dest mvi_cond → "mvi" uimm19 load_dest load_cond load → mvi | mvi_cond dma_ingress → "m0" | "m1" | "m2" | "m3" | "prg" dma_egress → "m0" | "m1" | "m2" | "m3" add_mode = "0" | "1" | "2" | "4" | "8" | "16" | "32" | "64" dma_dmah → ("dma" | "dmah") add_mode? dma_length_ram → "m0" | "m1" | "m2" | "m3" | "mc0" | "mc1" | "mc2" | "mc3" dma_ingress_imm → dma_dmah "d0" "," dma_ingress "," uimm8 dma_egress_imm → dma_dmah dma_egress "," "d0" "," uimm8 dma_ingress_ram → dma_dmah "d0" "," dma_ingress "," dma_length_ram dma_egress_ram → dma_dmah dma_egress "," "d0" "," dma_length_ram dma → dma_ingress_imm | dma_egress_imm | dma_ingress_ram | dma_egress_ram jump_cond → "z" | "nz" | "s" | "ns" | "c" | "nc" | "t0" | "nt0" | "zs" | "nzs" jmp → "jmp" uimm8 jmp_cond → "jmp" jump_cond jump → jmp | jmp_cond loop → "btm" | "lps" end → "end" | "endi" instruction → op | load | dma | jump | loop | end assignment_statement → identifier "=" expression "\n" label → identifier ":" instruction_statement → label? instruction? "\n" statement → assignment_statement | instruction_statement