-
Notifications
You must be signed in to change notification settings - Fork 0
/
pl0.h
139 lines (115 loc) · 2.4 KB
/
pl0.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
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
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// tokenize
typedef enum {
TK_IDENT,
TK_OP,
TK_PUNCT,
TK_NUM,
TK_EOF,
} TokenType;
typedef struct Token Token;
struct Token {
TokenType type;
char *str;
int len;
long val;
Token *next;
};
extern Token *current_token;
Token *new_token(TokenType type, Token *cur, char *str, int len);
Token *tokenize(char *src);
char *to_string(char *s, int len);
void view_tokens(Token *tok);
Token *peek();
Token *read();
// parse
typedef enum {
ND_IDENT, // identifier
ND_NUM, // number
ND_ADD, // +
ND_SUB, // -
ND_MUL, // *
ND_DIV, // /
ND_MOD, // %
ND_EQ, // =
ND_LT, // <
ND_LE, // <=
ND_NE, // <>
ND_ODD, // odd
ND_IF, // if statement
ND_WHILE, // while statement
ND_RET, // return
ND_WRITE, // write
ND_WRITELN, // writeln
ND_ASSG, // assignment
ND_BEGIN, // begin ... end
ND_VARS, // var
ND_CONST, // const
ND_CONSTDEF, // const
ND_FNDEF, // function
ND_ARGS, // args
ND_PARAMS, // parameters
ND_FNCALL, // function call
ND_BLOCK, // block
ND_NULL, // null
} NodeType;
typedef struct Node Node;
struct Node {
NodeType type;
Node *lhs;
Node *rhs;
Node *condition;
Node *body;
Node *next;
Node *name;
Node *args;
Node *params;
long val;
char *str;
};
Node *parse(Token *tok);
void view_ast(Node *node);
// data type & hashmap
typedef enum {
P_INT,
P_FUNC,
P_RETINT,
} pType;
typedef struct pVal {
pType type;
union {
long int intnum;
Node *func;
} val;
bool is_const;
} pVal;
pVal *pInt(long int x);
pVal *pFunc(Node *func);
typedef struct {
char *key;
pVal *val;
} Pair;
typedef struct {
int size;
Pair **data;
} Hashmap;
Hashmap *new_hashmap(int size);
Pair *new_pair(char *key, pVal *val);
void add2map(Hashmap *map, Pair *pair);
Pair *get_from_map(Hashmap *map, char *key);
void update_map(Hashmap *map, Pair *new_pair);
bool haskey(Hashmap *map, char *key);
// eval
#define HASHMAX 23
typedef struct _Env Env;
struct _Env {
Env *outer;
Hashmap *var;
};
Env *new_env(Env *outer);
pVal *eval(Node *node, Env *env);
extern Env *global_env;