DEADSOFTWARE

Добавлено вычисление размеров типа для аллокации
[dsw-obn.git] / oberon.h
1 #ifndef EMBEDED_OBERON_SCRIPT_H
2 #define EMBEDED_OBERON_SCRIPT_H
4 #include <libgccjit.h>
6 typedef struct gen_proc_s gen_proc_t;
7 typedef struct gen_type_s gen_type_t;
8 typedef struct gen_var_s gen_var_t;
9 typedef struct gen_block_s gen_block_t;
10 typedef struct gen_context_s gen_context_t;
12 struct gen_proc_s
13 {
14 gcc_jit_function * gcc_func;
15 };
17 struct gen_type_s
18 {
19 gcc_jit_type * gcc_type;
20 gcc_jit_struct * gcc_struct;
21 };
23 struct gen_var_s
24 {
25 gcc_jit_lvalue * gcc_lvalue;
26 gcc_jit_param * gcc_param;
27 gcc_jit_field * gcc_field;
28 };
30 struct gen_block_s
31 {
32 gcc_jit_block * gcc_block;
33 gen_block_t * up;
34 };
36 struct gen_context_s
37 {
38 gcc_jit_context * gcc_context;
39 gcc_jit_result * gcc_result;
40 gen_block_t * block;
41 unsigned record_count;
42 gcc_jit_lvalue * gcc_alloc;
43 };
45 typedef struct oberon_type_s oberon_type_t;
46 typedef struct oberon_object_s oberon_object_t;
47 typedef struct oberon_module_s oberon_module_t;
48 typedef struct oberon_context_s oberon_context_t;
49 typedef struct oberon_scope_s oberon_scope_t;
51 typedef struct oberon_item_s oberon_item_t;
52 typedef struct oberon_oper_s oberon_oper_t;
53 typedef union oberon_expr_u oberon_expr_t;
55 /*
56 * Структура oberon_scope_s (oberon_type_t) реализует стекообразную
57 * область видимости объектов.
58 * Поля:
59 * ctx -- контекст в котором область видимости была создана;
60 * list -- список объявлений. Первый элемент всегда существует,
61 * но не используется и должен быть пропущен.
62 * up -- ссылка на облась видимости уровнем выше.
63 */
65 struct oberon_scope_s
66 {
67 oberon_context_t * ctx;
68 oberon_object_t * list;
69 oberon_scope_t * up;
71 oberon_object_t * parent;
72 int local;
73 };
75 /*
76 * Формы типов данных.
77 * Тип VOID используется как заглушка возврата типа в обычных процедурах
78 */
80 enum
81 {
82 OBERON_TYPE_VOID,
83 OBERON_TYPE_INTEGER,
84 OBERON_TYPE_BOOLEAN,
85 OBERON_TYPE_PROCEDURE,
86 OBERON_TYPE_ARRAY,
87 OBERON_TYPE_RECORD,
88 OBERON_TYPE_POINTER
89 };
91 /*
92 * Структура oberon_type_s (oberon_type_t) описывает типы данных.
93 * Поля:
94 * class -- Форма типа данных (OBERON_TYPE_*).
95 * size -- Размер примитива в байтах или количество ячеек массива.
96 * Ноль для открытых массивов.
97 * num_decl -- Количество объявленых полей в структуре или сигнатуре процедуры.
98 * base -- Базовый тип структуры или тип возврата процедуры.
99 * decl -- Список объявлений. Перебор начинается с первого элемента.
101 * Таблица использования полей:
102 * class size num_decl base decl
103 * VOID - - - -
104 * INT + - - -
105 * BOOL + - - -
106 * PROC - + + +
107 */
109 struct oberon_type_s
111 int class;
112 int size;
114 int num_decl;
115 oberon_type_t * base;
116 oberon_object_t * decl;
118 oberon_module_t * module;
120 int recursive;
121 int initialized;
122 gen_type_t * gen_type;
123 };
125 /*
126 * Классы объектов.
127 * VAR -- переменная.
128 * TYPE -- тип данных.
129 * PROC -- процедура.
130 * PARAM -- параметр процедуры.
131 * VAR_PARAM -- VAR-параметр процедуры.
132 */
134 enum
136 OBERON_CLASS_VAR,
137 OBERON_CLASS_TYPE,
138 OBERON_CLASS_PROC,
139 OBERON_CLASS_PARAM,
140 OBERON_CLASS_VAR_PARAM,
141 OBERON_CLASS_CONST,
142 OBERON_CLASS_FIELD,
143 OBERON_CLASS_MODULE
144 };
146 /*
147 * Структура oberon_object_s (oberon_object_t) описывает все
148 * объявления которые могут иметь имя. От констант, до процедур.
149 * Поля:
150 * name -- имя объекта.
151 * class -- класс объекта (OBERON_CLASS_*).
152 * type -- ссылка на тип переменной, дескриптор типа или сигнатуру процедуры.
153 * next -- ссылка на следующий объект в списке.
154 */
156 typedef oberon_expr_t * (*GenerateFuncCallback)(oberon_context_t *, int, oberon_expr_t *);
157 typedef void (*GenerateProcCallback)(oberon_context_t *, int, oberon_expr_t *);
159 struct oberon_object_s
161 char * name;
162 int class;
163 int export;
164 int read_only;
166 int local;
167 int linked;
168 int initialized;
170 oberon_object_t * parent;
172 oberon_scope_t * scope; // for proc
173 int has_return; // for proc
174 int sysproc;
175 GenerateFuncCallback genfunc;
176 GenerateProcCallback genproc;
178 oberon_type_t * type;
179 oberon_item_t * value;
180 oberon_object_t * next;
182 oberon_module_t * module;
184 gen_var_t * gen_var;
185 gen_proc_t * gen_proc;
186 };
188 /*
189 * Структура oberon_module_s (oberon_module_t) описывает объявление модуля.
190 * Поля:
191 * name -- настоящее имя модуля.
192 * decl -- все глобальные объявления в модуле.
193 * begin -- Указатель на сгенерированный код тела модуля (секция BEGIN).
194 */
196 struct oberon_module_s
198 char * name;
199 int ready;
201 oberon_scope_t * decl;
203 oberon_module_t * next;
204 };
206 /*
207 * Структура oberon_context_s (oberon_context_t) учитывает текущее состояние интерпретатора.
208 * Один экземпляр не может использоваться в нескольких потоках одновременно.
209 * Поля:
210 * code -- входной буффер для сканера.
211 * code_index -- Текущая позия в буффере.
212 * с -- последний прочитанный символ.
213 * token -- последний прочитанный токен.
214 * string -- буфер с прочитанной строкой / идентификатором.
215 * всегда имеет уникальный адрес и может изменяться.
216 * integer -- прочитанное целое число.
217 * decl -- текущая область видимости.
218 * mod -- текущий модуль.
219 * int_type, bool_type, void_type -- стандартные типы.
220 * world_scope -- область видимости "мир" - выше модуля.
221 */
223 typedef const char * (*ModuleImportCallback)(const char * name);
225 struct oberon_context_s
227 /*** SCANER DATA ***/
228 const char * code;
229 int code_index;
231 char c;
232 int token;
233 char * string;
234 int integer;
235 /*** END SCANER DATA ***/
237 /*** PARSER DATA ***/
238 oberon_scope_t * decl;
239 oberon_module_t * mod;
240 /*** END PARSER DATA ***/
242 oberon_type_t * int_type;
243 oberon_type_t * bool_type;
244 oberon_type_t * void_type;
245 oberon_type_t * void_ptr_type;
246 oberon_scope_t * world_scope;
247 oberon_module_t * module_list;
248 ModuleImportCallback import_module;
249 gen_context_t * gen_context;
250 };
252 enum
254 MODE_VAR,
255 MODE_INTEGER,
256 MODE_BOOLEAN,
257 MODE_CALL,
258 MODE_INDEX,
259 MODE_FIELD,
260 MODE_DEREF,
261 MODE_NIL,
262 MODE_NEW
263 };
265 enum
267 OP_UNARY_MINUS,
268 OP_BITWISE_NOT,
269 OP_LOGIC_NOT,
270 OP_ABS,
272 OP_ADD,
273 OP_SUB,
274 OP_MUL,
275 OP_DIV,
276 OP_MOD,
277 OP_BITWISE_AND,
278 OP_BITWISE_XOR,
279 OP_BITWISE_OP,
280 OP_LOGIC_AND,
281 OP_LOGIC_OR,
283 OP_EQ,
284 OP_NEQ,
285 OP_LSS,
286 OP_LEQ,
287 OP_GRT,
288 OP_GEQ
289 };
291 struct oberon_item_s
293 int is_item; // == 1
294 oberon_type_t * result;
295 oberon_expr_t * next;
296 int read_only;
298 int mode;
299 int integer;
300 int boolean;
301 oberon_object_t * var;
303 oberon_item_t * parent;
305 int num_args;
306 oberon_expr_t * args;
307 };
309 struct oberon_oper_s
311 int is_item; // == 0
312 oberon_type_t * result;
313 oberon_expr_t * next;
314 int read_only;
316 int op;
317 oberon_expr_t * left;
318 oberon_expr_t * right;
319 };
321 union oberon_expr_u
323 struct {
324 int is_item;
325 oberon_type_t * result;
326 oberon_expr_t * next;
327 int read_only;
328 };
330 oberon_item_t item;
331 oberon_oper_t oper;
332 };
334 oberon_context_t * oberon_create_context(ModuleImportCallback import_module);
335 void oberon_destroy_context(oberon_context_t * ctx);
336 void oberon_register_global_type(oberon_context_t * ctx, oberon_type_t * type);
337 oberon_module_t * oberon_compile_module(oberon_context_t * ctx, const char * code);
338 void oberon_error(oberon_context_t * ctx, const char * fmt, ...);
340 #endif // EMBEDED_OBERON_SCRIPT_H