1 #ifndef EMBEDED_OBERON_SCRIPT_H
2 #define EMBEDED_OBERON_SCRIPT_H
4 #include <libgccjit.h>
12 struct gen_proc_s
13 {
15 };
17 struct gen_type_s
18 {
21 };
23 struct gen_var_s
24 {
28 };
30 struct gen_block_s
31 {
34 };
36 struct gen_context_s
37 {
43 };
55 /*
56 * Структура oberon_scope_s (oberon_type_t) реализует стекообразную
57 * область видимости объектов.
58 * Поля:
59 * ctx -- контекст в котором область видимости была создана;
60 * list -- список объявлений. Первый элемент всегда существует,
61 * но не используется и должен быть пропущен.
62 * up -- ссылка на облась видимости уровнем выше.
63 */
65 struct oberon_scope_s
66 {
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 -- Список объявлений. Перебор начинается с первого элемента.
101 *
102 * Таблица использования полей:
103 * class size num_decl base decl
104 * VOID - - - -
105 * INT + - - -
106 * BOOL + - - -
107 * PROC - + + +
108 */
110 struct oberon_type_s
111 {
124 };
126 /*
127 * Классы объектов.
128 * VAR -- переменная.
129 * TYPE -- тип данных.
130 * PROC -- процедура.
131 * PARAM -- параметр процедуры.
132 * VAR_PARAM -- VAR-параметр процедуры.
133 */
135 enum
136 {
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 */
160 struct oberon_object_s
161 {
176 GenerateFuncCallback genfunc;
177 GenerateProcCallback genproc;
187 };
189 /*
190 * Структура oberon_module_s (oberon_module_t) описывает объявление модуля.
191 * Поля:
192 * name -- настоящее имя модуля.
193 * decl -- все глобальные объявления в модуле.
194 * begin -- Указатель на сгенерированный код тела модуля (секция BEGIN).
195 */
197 struct oberon_module_s
198 {
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 */
226 struct oberon_context_s
227 {
228 /*** SCANER DATA ***/
237 /*** END SCANER DATA ***/
239 /*** PARSER DATA ***/
242 /*** END PARSER DATA ***/
251 ModuleImportCallback import_module;
253 };
255 enum
256 {
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
270 {
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
296 {
312 };
314 struct oberon_oper_s
315 {
324 };
326 union oberon_expr_u
327 {
333 };
335 oberon_item_t item;
336 oberon_oper_t oper;
337 };