-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlearnpi.h
More file actions
225 lines (179 loc) · 5.1 KB
/
learnpi.h
File metadata and controls
225 lines (179 loc) · 5.1 KB
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
#ifndef LEARNPI_H
#define LEARNPI_H
#define NHASH 9997
// #define RPI_SIMULATION 1
#include <stdbool.h>
#include "types.h"
// Expression types
enum expression_type {
CONSTANT = 1,
NEW_REFERENCE,
ASSIGNMENT,
COMPLEX_ASSIGNMENT,
STATEMENT_LIST,
UNARY_MINUS,
LOGICAL_AND,
LOGICAL_OR,
IF_STATEMENT,
LOOP_STATEMENT,
FOR_STATEMENT,
DECLARATION,
DECLARATION_WITH_ASSIGNMENT,
BUILTIN_TYPE,
USER_CALL
};
// Structure for a variable symbol
struct symbol {
char *name;
struct val *value;
struct ast *func;
struct symbol_list *syms;
};
// Symbol table variable
struct symbol symtab[NHASH];
// Structure for value
struct val {
int type;
union datavalue {
int bit;
int integer;
double decimal;
char * string;
unsigned * GPIO_PIN;
} datavalue;
};
// Structure for symbol list
struct symbol_list {
char *sym;
struct symbol_list *next;
};
// Structure for Abstract Syntax Tree
struct ast {
int nodetype;
struct ast *l;
struct ast *r;
};
// Symbol assignment structure
struct assign_symbol {
int nodetype;
char *s;
struct ast *v;
};
// Structure for flow control
struct flow {
int nodetype;
struct ast *condition;
struct ast *then_list;
struct ast *else_list;
};
// Structure for for_flow control
struct for_flow {
int nodetype;
struct ast *initialization;
struct ast *condition;
struct ast *then_list;
struct ast *else_list;
};
// Structure for symbol reference
struct symbol_reference {
int nodetype;
char *s;
};
// Structure for symbol assignment
struct symasgn {
int nodetype;
char *s;
struct ast *v;
};
// Structure for variable declaration
struct declare_symbol {
int nodetype;
int type;
char *s;
};
// Structure for variable declaration with assignment
struct assign_and_declare_symbol {
int nodetype;
int type;
char *s;
struct ast *value;
};
// Structure for variable declaration with assignment
struct assign_and_declare_complex_symbol {
int nodetype;
int type;
char *s;
struct ast *value;
};
// Structure for constant values
struct constant_value {
int nodetype;
struct val *v;
};
// Structure for builtin function call
struct builtin_function_call {
int nodetype;
struct ast *argument_list;
enum built_in_function_types function_type;
char *s;
};
// Structure for user function call
struct user_function_call {
int nodetype;
struct ast *argument_list;
char *s;
};
// Lookup function
struct symbol *lookup(char*);
// Function for new declaration
struct ast *new_declaration(char *s, int type);
// Function for new variable asignment
struct ast * new_assignment(char *s, struct ast *v);
// Function to create a new control flow
struct ast *newflow(int nodetype, struct ast *cond, struct ast *tl, struct ast *tr);
// Function to create a new control for_flow
struct ast *new_for_flow(int nodetype, struct ast *initialization, struct ast *cond, struct ast *tl, struct ast *tr);
// Function for new complex variable assignment
struct ast *new_complex_assignment(char *s, int type, struct ast *l);
// Function to create an AST with generic node type and one child
struct ast *new_ast_with_child(int type, struct ast *l);
// Function to create an AST with generic node type and two children
struct ast *new_ast_with_children(int type, struct ast *l, struct ast *r);
// Function to create a new reference
struct ast *new_reference(char *s);
// Function to create an AST with comparision type
struct ast *new_comparison(int type, struct ast *l, struct ast *r);
// Function to create a new value
struct ast *new_value(struct val *value);
// Symbol table stack reference to use in main function
struct symtable_stack *symstack;
// Function to create a built in function
struct ast *new_builtin_function(int function_type, char *s, struct ast *l);
// Function to create a node for user defined function in the AST
struct ast *new_user_function(char *s, struct ast *argument_list);
// Function to define a custom function
void define_function(char *function_name, struct symbol_list *symbol_list, struct ast *function);
// Function to create a new symbol list
struct symbol_list *create_symbol_list(char *symbol, struct symbol_list *next);
// Function to create a new control flow
struct ast *newflow(int nodetype, struct ast *cond, struct ast *tl, struct ast *tr);
// Function to evaluate an AST
struct val *eval(struct ast *);
// Function to free an AST
void treefree(struct ast *);
// Function to initialize symbol table stack
void initialize_symbol_table_stack();
// Function to free symbol table stack
void free_symbol_table_stack();
// Function to check if we have a primitive type
bool is_primitive(int type);
// Helper method to check value type
int get_value_type(struct val *v);
// Function to create a node for built in function in the AST
struct ast *new_builtin_function(int function_type, char *s, struct ast *l);
// Function to call built in functions
struct val *builtin_function_call(struct builtin_function_call *builtin_function);
// Function to call custom functions
void calluser(struct user_function_call *user_function);
void dodef(char *n, struct symbol_list *symbol_list, struct ast *function);
#endif