forked from zakirullin/tiny-compiler
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerator.h
39 lines (32 loc) · 951 Bytes
/
generator.h
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
#ifndef GENERATOR_H
#define GENERATOR_H
#include "symbol_table.h"
#include "ast.h"
#include "parser.h"
#include "codes.h"
#define MAX_PROGRAM_SIZE 300
#define COMPILE_BOTH compile(node->op1); compile(node->op2)
typedef int byte;
byte obj[MAX_PROGRAM_SIZE];
byte* cur = obj;
void gen(int code)
{
*cur++ = code;
}
void compile(struct Node* node)
{
if (node == NULL)
return;
switch (node->type) {
case SEQ_TYPE: COMPILE_BOTH; break;
case SET_TYPE: compile(node->op2); gen(WRITE); gen(node->op1->val); break;
case VAR_TYPE: gen(READ); gen(node->val); break;
case NUM_TYPE: gen(PUSH); gen(node->val); break;
case ADD_TYPE: COMPILE_BOTH; gen(ADD); break;
case SUB_TYPE: COMPILE_BOTH; gen(SUB); break;
case MUL_TYPE: COMPILE_BOTH; gen(MUL); break;
case DIV_TYPE: COMPILE_BOTH; gen(DIV); break;
case RET_TYPE: COMPILE_BOTH; gen(RET); break;
}
}
#endif