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 };
44 typedef struct oberon_type_s oberon_type_t;
45 typedef struct oberon_object_s oberon_object_t;
46 typedef struct oberon_module_s oberon_module_t;
47 typedef struct oberon_context_s oberon_context_t;
48 typedef struct oberon_scope_s oberon_scope_t;
50 typedef struct oberon_item_s oberon_item_t;
51 typedef struct oberon_oper_s oberon_oper_t;
52 typedef union oberon_expr_u oberon_expr_t;
54 /*
55 * Структура oberon_scope_s (oberon_type_t) реализует стекообразную
56 * область видимости объектов.
57 * Поля:
58 * ctx -- контекст в котором область видимости была создана;
59 * list -- список объявлений. Первый элемент всегда существует,
60 * но не используется и должен быть пропущен.
61 * up -- ссылка на облась видимости уровнем выше.
62 */
64 struct oberon_scope_s
65 {
66 oberon_context_t * ctx;
67 oberon_object_t * list;
68 oberon_scope_t * up;
70 oberon_object_t * parent;
71 int local;
72 };
74 /*
75 * Формы типов данных.
76 * Тип VOID используется как заглушка возврата типа в обычных процедурах
77 */
79 enum
80 {
81 OBERON_TYPE_VOID,
82 OBERON_TYPE_INTEGER,
83 OBERON_TYPE_BOOLEAN,
84 OBERON_TYPE_PROCEDURE,
85 OBERON_TYPE_ARRAY,
86 OBERON_TYPE_RECORD,
87 OBERON_TYPE_POINTER
88 };
90 /*
91 * Структура oberon_type_s (oberon_type_t) описывает типы данных.
92 * Поля:
93 * class -- Форма типа данных (OBERON_TYPE_*).
94 * size -- Размер примитива в байтах или количество ячеек массива.
95 * Ноль для открытых массивов.
96 * num_decl -- Количество объявленых полей в структуре или сигнатуре процедуры.
97 * base -- Базовый тип структуры или тип возврата процедуры.
98 * decl -- Список объявлений. Перебор начинается с первого элемента.
99 *
100 * Таблица использования полей:
101 * class size num_decl base decl
102 * VOID - - - -
103 * INT + - - -
104 * BOOL + - - -
105 * PROC - + + +
106 */
108 struct oberon_type_s
110 int class;
111 int size;
113 int num_decl;
114 oberon_type_t * base;
115 oberon_object_t * decl;
117 int recursive;
118 int initialized;
119 gen_type_t * gen_type;
120 };
122 /*
123 * Классы объектов.
124 * VAR -- переменная.
125 * TYPE -- тип данных.
126 * PROC -- процедура.
127 * PARAM -- параметр процедуры.
128 * VAR_PARAM -- VAR-параметр процедуры.
129 */
131 enum
133 OBERON_CLASS_VAR,
134 OBERON_CLASS_TYPE,
135 OBERON_CLASS_PROC,
136 OBERON_CLASS_PARAM,
137 OBERON_CLASS_VAR_PARAM,
138 OBERON_CLASS_CONST,
139 OBERON_CLASS_FIELD,
140 OBERON_CLASS_MODULE
141 };
143 /*
144 * Структура oberon_object_s (oberon_object_t) описывает все
145 * объявления которые могут иметь имя. От констант, до процедур.
146 * Поля:
147 * name -- имя объекта.
148 * class -- класс объекта (OBERON_CLASS_*).
149 * type -- ссылка на тип переменной, дескриптор типа или сигнатуру процедуры.
150 * next -- ссылка на следующий объект в списке.
151 */
153 typedef oberon_expr_t * (*GenerateFuncCallback)(oberon_context_t *, int, oberon_expr_t *);
154 typedef void (*GenerateProcCallback)(oberon_context_t *, int, oberon_expr_t *);
156 struct oberon_object_s
158 char * name;
159 int class;
160 int export;
161 int read_only;
163 int local;
164 int linked;
165 int initialized;
167 oberon_object_t * parent;
169 oberon_scope_t * scope; // for proc
170 int has_return; // for proc
171 int sysproc;
172 GenerateFuncCallback genfunc;
173 GenerateProcCallback genproc;
175 oberon_type_t * type;
176 oberon_item_t * value;
177 oberon_object_t * next;
179 oberon_module_t * module;
181 gen_var_t * gen_var;
182 gen_proc_t * gen_proc;
183 };
185 /*
186 * Структура oberon_module_s (oberon_module_t) описывает объявление модуля.
187 * Поля:
188 * name -- настоящее имя модуля.
189 * decl -- все глобальные объявления в модуле.
190 * begin -- Указатель на сгенерированный код тела модуля (секция BEGIN).
191 */
193 struct oberon_module_s
195 char * name;
196 int ready;
198 oberon_scope_t * decl;
200 oberon_module_t * next;
201 };
203 /*
204 * Структура oberon_context_s (oberon_context_t) учитывает текущее состояние интерпретатора.
205 * Один экземпляр не может использоваться в нескольких потоках одновременно.
206 * Поля:
207 * code -- входной буффер для сканера.
208 * code_index -- Текущая позия в буффере.
209 * с -- последний прочитанный символ.
210 * token -- последний прочитанный токен.
211 * string -- буфер с прочитанной строкой / идентификатором.
212 * всегда имеет уникальный адрес и может изменяться.
213 * integer -- прочитанное целое число.
214 * decl -- текущая область видимости.
215 * mod -- текущий модуль.
216 * int_type, bool_type, void_type -- стандартные типы.
217 * world_scope -- область видимости "мир" - выше модуля.
218 */
220 typedef const char * (*ModuleImportCallback)(const char * name);
222 struct oberon_context_s
224 /*** SCANER DATA ***/
225 const char * code;
226 int code_index;
228 char c;
229 int token;
230 char * string;
231 int integer;
232 /*** END SCANER DATA ***/
234 /*** PARSER DATA ***/
235 oberon_scope_t * decl;
236 oberon_module_t * mod;
237 /*** END PARSER DATA ***/
239 oberon_type_t * int_type;
240 oberon_type_t * bool_type;
241 oberon_type_t * void_type;
242 oberon_type_t * void_ptr_type;
243 oberon_scope_t * world_scope;
244 oberon_module_t * module_list;
245 ModuleImportCallback import_module;
246 gen_context_t * gen_context;
247 };
249 enum
251 MODE_VAR,
252 MODE_INTEGER,
253 MODE_BOOLEAN,
254 MODE_CALL,
255 MODE_INDEX,
256 MODE_FIELD,
257 MODE_DEREF,
258 MODE_NIL
259 };
261 enum
263 OP_UNARY_MINUS,
264 OP_BITWISE_NOT,
265 OP_LOGIC_NOT,
266 OP_ABS,
268 OP_ADD,
269 OP_SUB,
270 OP_MUL,
271 OP_DIV,
272 OP_MOD,
273 OP_BITWISE_AND,
274 OP_BITWISE_XOR,
275 OP_BITWISE_OP,
276 OP_LOGIC_AND,
277 OP_LOGIC_OR,
279 OP_EQ,
280 OP_NEQ,
281 OP_LSS,
282 OP_LEQ,
283 OP_GRT,
284 OP_GEQ
285 };
287 struct oberon_item_s
289 int is_item; // == 1
290 oberon_type_t * result;
291 oberon_expr_t * next;
293 int mode;
294 int integer;
295 int boolean;
296 oberon_object_t * var;
298 oberon_item_t * parent;
300 int num_args;
301 oberon_expr_t * args;
302 };
304 struct oberon_oper_s
306 int is_item; // == 0
307 oberon_type_t * result;
308 oberon_expr_t * next;
310 int op;
311 oberon_expr_t * left;
312 oberon_expr_t * right;
313 };
315 union oberon_expr_u
317 struct {
318 int is_item;
319 oberon_type_t * result;
320 oberon_expr_t * next;
321 };
323 oberon_item_t item;
324 oberon_oper_t oper;
325 };
327 oberon_context_t * oberon_create_context(ModuleImportCallback import_module);
328 void oberon_destroy_context(oberon_context_t * ctx);
329 void oberon_register_global_type(oberon_context_t * ctx, oberon_type_t * type);
330 oberon_module_t * oberon_compile_module(oberon_context_t * ctx, const char * code);
331 void oberon_error(oberon_context_t * ctx, const char * fmt, ...);
333 #endif // EMBEDED_OBERON_SCRIPT_H