summaryrefslogtreecommitdiff
path: root/parser.y
blob: 48bd13f4f39be14256b86125e9ccc0cf99cf3fa3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
%{

#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:	line
	|	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 T_EOL
	;