DEADSOFTWARE

189369b9c0cb324564b82aca21b21000a416e944
[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 OBERON_TYPE_REAL
90 };
92 /*
93 * Структура oberon_type_s (oberon_type_t) описывает типы данных.
94 * Поля:
95 * class -- Форма типа данных (OBERON_TYPE_*).
96 * size -- Размер примитива в байтах или количество ячеек массива.
97 * Ноль для открытых массивов.
98 * num_decl -- Количество объявленых полей в структуре или сигнатуре процедуры.
99 * base -- Базовый тип структуры или тип возврата процедуры.
100 * decl -- Список объявлений. Перебор начинается с первого элемента.
102 * Таблица использования полей:
103 * class size num_decl base decl
104 * VOID - - - -
105 * INT + - - -
106 * BOOL + - - -
107 * PROC - + + +
108 */
110 struct oberon_type_s
112 int class;
113 int size;
115 int num_decl;
116 oberon_type_t * base;
117 oberon_object_t * decl;
119 oberon_module_t * module;
121 int recursive;
122 int initialized;
123 gen_type_t * gen_type;
124 };
126 /*
127 * Классы объектов.
128 * VAR -- переменная.
129 * TYPE -- тип данных.
130 * PROC -- процедура.
131 * PARAM -- параметр процедуры.
132 * VAR_PARAM -- VAR-параметр процедуры.
133 */
135 enum
137 OBERON_CLASS_VAR,
138 OBERON_CLASS_TYPE,
139 OBERON_CLASS_PROC,
140 OBERON_CLASS_PARAM,
141 OBERON_CLASS_VAR_PARAM,
142 OBERON_CLASS_CONST,
143 OBERON_CLASS_FIELD,
144 OBERON_CLASS_MODULE
145 };
147 /*
148 * Структура oberon_object_s (oberon_object_t) описывает все
149 * объявления которые могут иметь имя. От констант, до процедур.
150 * Поля:
151 * name -- имя объекта.
152 * class -- класс объекта (OBERON_CLASS_*).
153 * type -- ссылка на тип переменной, дескриптор типа или сигнатуру процедуры.
154 * next -- ссылка на следующий объект в списке.
155 */
157 typedef oberon_expr_t * (*GenerateFuncCallback)(oberon_context_t *, int, oberon_expr_t *);
158 typedef void (*GenerateProcCallback)(oberon_context_t *, int, oberon_expr_t *);
160 struct oberon_object_s
162 char * name;
163 int class;
164 int export;
165 int read_only;
167 int local;
168 int linked;
169 int initialized;
171 oberon_object_t * parent;
173 oberon_scope_t * scope; // for proc
174 int has_return; // for proc
175 int sysproc;
176 GenerateFuncCallback genfunc;
177 GenerateProcCallback genproc;
179 oberon_type_t * type;
180 oberon_item_t * value;
181 oberon_object_t * next;
183 oberon_module_t * module;
185 gen_var_t * gen_var;
186 gen_proc_t * gen_proc;
187 };
189 /*
190 * Структура oberon_module_s (oberon_module_t) описывает объявление модуля.
191 * Поля:
192 * name -- настоящее имя модуля.
193 * decl -- все глобальные объявления в модуле.
194 * begin -- Указатель на сгенерированный код тела модуля (секция BEGIN).
195 */
197 struct oberon_module_s
199 char * name;
200 int ready;
202 oberon_scope_t * decl;
204 oberon_module_t * next;
205 };
207 /*
208 * Структура oberon_context_s (oberon_context_t) учитывает текущее состояние интерпретатора.
209 * Один экземпляр не может использоваться в нескольких потоках одновременно.
210 * Поля:
211 * code -- входной буффер для сканера.
212 * code_index -- Текущая позия в буффере.
213 * с -- последний прочитанный символ.
214 * token -- последний прочитанный токен.
215 * string -- буфер с прочитанной строкой / идентификатором.
216 * всегда имеет уникальный адрес и может изменяться.
217 * integer -- прочитанное целое число.
218 * decl -- текущая область видимости.
219 * mod -- текущий модуль.
220 * int_type, bool_type, void_type -- стандартные типы.
221 * world_scope -- область видимости "мир" - выше модуля.
222 */
224 typedef const char * (*ModuleImportCallback)(const char * name);
226 struct oberon_context_s
228 /*** SCANER DATA ***/
229 const char * code;
230 int code_index;
232 char c;
233 int token;
234 char * string;
235 long integer;
236 double real;
237 /*** END SCANER DATA ***/
239 /*** PARSER DATA ***/
240 oberon_scope_t * decl;
241 oberon_module_t * mod;
242 /*** END PARSER DATA ***/
244 oberon_type_t * int_type;
245 oberon_type_t * bool_type;
246 oberon_type_t * real_type;
247 oberon_type_t * void_type;
248 oberon_type_t * void_ptr_type;
249 oberon_scope_t * world_scope;
250 oberon_module_t * module_list;
251 ModuleImportCallback import_module;
252 gen_context_t * gen_context;
253 };
255 enum
257 MODE_VAR,
258 MODE_INTEGER,
259 MODE_BOOLEAN,
260 MODE_CALL,
261 MODE_INDEX,
262 MODE_FIELD,
263 MODE_DEREF,
264 MODE_NIL,
265 MODE_NEW,
266 MODE_REAL
267 };
269 enum
271 OP_UNARY_MINUS,
272 OP_BITWISE_NOT,
273 OP_LOGIC_NOT,
274 OP_ABS,
276 OP_ADD,
277 OP_SUB,
278 OP_MUL,
279 OP_DIV,
280 OP_MOD,
281 OP_BITWISE_AND,
282 OP_BITWISE_XOR,
283 OP_BITWISE_OP,
284 OP_LOGIC_AND,
285 OP_LOGIC_OR,
287 OP_EQ,
288 OP_NEQ,
289 OP_LSS,
290 OP_LEQ,
291 OP_GRT,
292 OP_GEQ
293 };
295 struct oberon_item_s
297 int is_item; // == 1
298 oberon_type_t * result;
299 oberon_expr_t * next;
300 int read_only;
302 int mode;
303 long integer;
304 double real;
305 int boolean;
306 oberon_object_t * var;
308 oberon_item_t * parent;
310 int num_args;
311 oberon_expr_t * args;
312 };
314 struct oberon_oper_s
316 int is_item; // == 0
317 oberon_type_t * result;
318 oberon_expr_t * next;
319 int read_only;
321 int op;
322 oberon_expr_t * left;
323 oberon_expr_t * right;
324 };
326 union oberon_expr_u
328 struct {
329 int is_item;
330 oberon_type_t * result;
331 oberon_expr_t * next;
332 int read_only;
333 };
335 oberon_item_t item;
336 oberon_oper_t oper;
337 };
339 oberon_context_t * oberon_create_context(ModuleImportCallback import_module);
340 void oberon_destroy_context(oberon_context_t * ctx);
341 void oberon_register_global_type(oberon_context_t * ctx, oberon_type_t * type);
342 oberon_module_t * oberon_compile_module(oberon_context_t * ctx, const char * code);
343 void oberon_error(oberon_context_t * ctx, const char * fmt, ...);
345 #endif // EMBEDED_OBERON_SCRIPT_H