summaryrefslogtreecommitdiff
path: root/parser.y
diff options
context:
space:
mode:
Diffstat (limited to 'parser.y')
-rw-r--r--parser.y156
1 files changed, 156 insertions, 0 deletions
diff --git a/parser.y b/parser.y
new file mode 100644
index 0000000..78bf123
--- /dev/null
+++ b/parser.y
@@ -0,0 +1,156 @@
+%{
+
+#include <stdio.h>
+
+#include "lexer.h"
+#include "mnemonics.h"
+
+void yyerror(const char *msg)
+{
+ fprintf(stderr, "%s\n", msg);
+}
+
+#define INSTRUCTION(mnem) (struct instruction) { MNEM_ ## mnem }
+
+%}
+
+%output "parser.c"
+%defines "parser.h"
+
+%code requires {
+ #include "nqasm.h"
+}
+
+%union {
+ struct instruction inst;
+}
+
+%token END 0 "end of file"
+
+%token T_SPACE
+%token T_EOL
+
+%token T_ADD
+%token T_SUB
+%token T_MUL
+%token T_DIV
+%token T_AND
+%token T_OR
+%token T_XOR
+%token T_LSL
+%token T_LSR
+%token T_ASL
+%token T_ASR
+%token T_ROL
+%token T_ROR
+%token T_NOT
+%token T_NEG
+%token T_BTC
+%token T_BTS
+%token T_MOV
+%token T_ST_B
+%token T_ST_W
+%token T_LD_BL
+%token T_LD_BH
+%token T_LD_W
+%token T_LDI_BL
+%token T_LDI_BH
+%token T_BEQ
+%token T_BNE
+%token T_BGT
+%token T_BGE
+%token T_BLT
+%token T_BLE
+%token T_BRA
+%token T_JMP
+%token T_ADDPC
+%token T_NOP
+
+%type <inst> inst
+%%
+
+input: %empty
+ | input line
+ ;
+
+line: T_SPACE inst eol
+ { add_instruction(&$2); }
+ | eol
+ ;
+
+inst: T_ADD
+ { $$ = INSTRUCTION(ADD); }
+ | T_SUB
+ { $$ = INSTRUCTION(SUB); }
+ | T_MUL
+ { $$ = INSTRUCTION(MUL); }
+ | T_DIV
+ { $$ = INSTRUCTION(DIV); }
+ | T_AND
+ { $$ = INSTRUCTION(AND); }
+ | T_OR
+ { $$ = INSTRUCTION(OR); }
+ | T_XOR
+ { $$ = INSTRUCTION(XOR); }
+ | T_LSL
+ { $$ = INSTRUCTION(LSL); }
+ | T_LSR
+ { $$ = INSTRUCTION(LSR); }
+ | T_ASL
+ { $$ = INSTRUCTION(ASL); }
+ | T_ASR
+ { $$ = INSTRUCTION(ASR); }
+ | T_ROL
+ { $$ = INSTRUCTION(ROL); }
+ | T_ROR
+ { $$ = INSTRUCTION(ROR); }
+ | T_NOT
+ { $$ = INSTRUCTION(NOT); }
+ | T_NEG
+ { $$ = INSTRUCTION(NEG); }
+ | T_BTC
+ { $$ = INSTRUCTION(BTC); }
+ | T_BTS
+ { $$ = INSTRUCTION(BTS); }
+ | T_MOV
+ { $$ = INSTRUCTION(MOV); }
+ | T_ST_B
+ { $$ = INSTRUCTION(ST_B); }
+ | T_ST_W
+ { $$ = INSTRUCTION(ST_W); }
+ | T_LD_BL
+ { $$ = INSTRUCTION(LD_BL); }
+ | T_LD_BH
+ { $$ = INSTRUCTION(LD_BH); }
+ | T_LD_W
+ { $$ = INSTRUCTION(LD_W); }
+ | T_LDI_BL
+ { $$ = INSTRUCTION(LDI_BL); }
+ | T_LDI_BH
+ { $$ = INSTRUCTION(LDI_BH); }
+ | T_BEQ
+ { $$ = INSTRUCTION(BEQ); }
+ | T_BNE
+ { $$ = INSTRUCTION(BNE); }
+ | T_BGT
+ { $$ = INSTRUCTION(BGT); }
+ | T_BGE
+ { $$ = INSTRUCTION(BGE); }
+ | T_BLT
+ { $$ = INSTRUCTION(BLT); }
+ | T_BLE
+ { $$ = INSTRUCTION(BLE); }
+ | T_BRA
+ { $$ = INSTRUCTION(BRA); }
+ | T_JMP
+ { $$ = INSTRUCTION(JMP); }
+ | T_ADDPC
+ { $$ = INSTRUCTION(ADDPC); }
+ | T_NOP
+ { $$ = INSTRUCTION(NOP); }
+ ;
+
+eol: T_EOL
+ | T_SPACE END
+ | END
+ ;