1 #ifndef EMBEDED_OBERON_SCRIPT_H
2 #define EMBEDED_OBERON_SCRIPT_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
;
14 gcc_jit_function
* gcc_func
;
19 gcc_jit_type
* gcc_type
;
20 gcc_jit_struct
* gcc_struct
;
25 gcc_jit_lvalue
* gcc_lvalue
;
26 gcc_jit_param
* gcc_param
;
27 gcc_jit_field
* gcc_field
;
32 gcc_jit_block
* gcc_block
;
38 gcc_jit_context
* gcc_context
;
39 gcc_jit_result
* gcc_result
;
43 typedef struct oberon_type_s oberon_type_t
;
44 typedef struct oberon_object_s oberon_object_t
;
45 typedef struct oberon_module_s oberon_module_t
;
46 typedef struct oberon_context_s oberon_context_t
;
47 typedef struct oberon_scope_s oberon_scope_t
;
49 typedef struct oberon_item_s oberon_item_t
;
50 typedef struct oberon_oper_s oberon_oper_t
;
51 typedef union oberon_expr_u oberon_expr_t
;
54 * Структура oberon_scope_s (oberon_type_t) реализует стекообразную
55 * область видимости объектов.
57 * ctx -- контекст в котором область видимости была создана;
58 * list -- список объявлений. Первый элемент всегда существует,
59 * но не используется и должен быть пропущен.
60 * up -- ссылка на облась видимости уровнем выше.
65 oberon_context_t
* ctx
;
66 oberon_object_t
* list
;
69 oberon_object_t
* parent
;
75 * Тип VOID используется как заглушка возврата типа в обычных процедурах
83 OBERON_TYPE_PROCEDURE
,
90 * Структура oberon_type_s (oberon_type_t) описывает типы данных.
92 * class -- Форма типа данных (OBERON_TYPE_*).
93 * size -- Размер примитива в байтах или количество ячеек массива.
94 * Ноль для открытых массивов.
95 * num_decl -- Количество объявленых полей в структуре или сигнатуре процедуры.
96 * base -- Базовый тип структуры или тип возврата процедуры.
97 * decl -- Список объявлений. Перебор начинается с первого элемента.
99 * Таблица использования полей:
100 * class size num_decl base decl
113 oberon_type_t
* base
;
114 oberon_object_t
* decl
;
118 gen_type_t
* gen_type
;
124 * TYPE -- тип данных.
126 * PARAM -- параметр процедуры.
127 * VAR_PARAM -- VAR-параметр процедуры.
136 OBERON_CLASS_VAR_PARAM
,
142 * Структура oberon_object_s (oberon_object_t) описывает все
143 * объявления которые могут иметь имя. От констант, до процедур.
145 * name -- имя объекта.
146 * class -- класс объекта (OBERON_CLASS_*).
147 * type -- ссылка на тип переменной, дескриптор типа или сигнатуру процедуры.
148 * next -- ссылка на следующий объект в списке.
151 struct oberon_object_s
160 oberon_object_t
* parent
;
161 int has_return
; // for proc
164 oberon_type_t
* type
;
165 oberon_item_t
* value
;
166 oberon_object_t
* next
;
169 gen_proc_t
* gen_proc
;
173 * Структура oberon_module_s (oberon_module_t) описывает объявление модуля.
175 * name -- настоящее имя модуля.
176 * decl -- все глобальные объявления в модуле.
177 * begin -- Указатель на сгенерированный код тела модуля (секция BEGIN).
180 struct oberon_module_s
184 oberon_scope_t
* decl
;
190 * Структура oberon_context_s (oberon_context_t) учитывает текущее состояние интерпретатора.
191 * Один экземпляр не может использоваться в нескольких потоках одновременно.
193 * code -- входной буффер для сканера.
194 * code_index -- Текущая позия в буффере.
195 * с -- последний прочитанный символ.
196 * token -- последний прочитанный токен.
197 * string -- буфер с прочитанной строкой / идентификатором.
198 * всегда имеет уникальный адрес и может изменяться.
199 * integer -- прочитанное целое число.
200 * decl -- текущая область видимости.
201 * mod -- текущий модуль.
202 * int_type, bool_type, void_type -- стандартные типы.
203 * world_scope -- область видимости "мир" - выше модуля.
206 struct oberon_context_s
216 oberon_scope_t
* decl
;
217 oberon_module_t
* mod
;
219 oberon_type_t
* int_type
;
220 oberon_type_t
* bool_type
;
221 oberon_type_t
* void_type
;
222 oberon_type_t
* void_ptr_type
;
223 oberon_scope_t
* world_scope
;
225 gen_context_t
* gen_context
;
262 oberon_type_t
* result
;
263 oberon_expr_t
* next
;
268 oberon_object_t
* var
;
270 oberon_item_t
* parent
;
273 oberon_expr_t
* args
;
279 oberon_type_t
* result
;
280 oberon_expr_t
* next
;
283 oberon_expr_t
* left
;
284 oberon_expr_t
* right
;
291 oberon_type_t
* result
;
292 oberon_expr_t
* next
;
299 oberon_context_t
* oberon_create_context();
300 void oberon_destroy_context(oberon_context_t
* ctx
);
301 void oberon_register_global_type(oberon_context_t
* ctx
, oberon_type_t
* type
);
302 oberon_module_t
* oberon_compile_module(oberon_context_t
* ctx
, const char * code
);
303 void oberon_error(oberon_context_t
* ctx
, const char * fmt
, ...);
305 #endif // EMBEDED_OBERON_SCRIPT_H