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 {
42 };
54 /*
55 * Структура oberon_scope_s (oberon_type_t) реализует стекообразную
56 * область видимости объектов.
57 * Поля:
58 * ctx -- контекст в котором область видимости была создана;
59 * list -- список объявлений. Первый элемент всегда существует,
60 * но не используется и должен быть пропущен.
61 * up -- ссылка на облась видимости уровнем выше.
62 */
64 struct oberon_scope_s
65 {
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
109 {
120 };
122 /*
123 * Классы объектов.
124 * VAR -- переменная.
125 * TYPE -- тип данных.
126 * PROC -- процедура.
127 * PARAM -- параметр процедуры.
128 * VAR_PARAM -- VAR-параметр процедуры.
129 */
131 enum
132 {
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 */
156 struct oberon_object_s
157 {
170 GenerateFuncCallback genfunc;
171 GenerateProcCallback genproc;
181 };
183 /*
184 * Структура oberon_module_s (oberon_module_t) описывает объявление модуля.
185 * Поля:
186 * name -- настоящее имя модуля.
187 * decl -- все глобальные объявления в модуле.
188 * begin -- Указатель на сгенерированный код тела модуля (секция BEGIN).
189 */
191 struct oberon_module_s
192 {
199 };
201 /*
202 * Структура oberon_context_s (oberon_context_t) учитывает текущее состояние интерпретатора.
203 * Один экземпляр не может использоваться в нескольких потоках одновременно.
204 * Поля:
205 * code -- входной буффер для сканера.
206 * code_index -- Текущая позия в буффере.
207 * с -- последний прочитанный символ.
208 * token -- последний прочитанный токен.
209 * string -- буфер с прочитанной строкой / идентификатором.
210 * всегда имеет уникальный адрес и может изменяться.
211 * integer -- прочитанное целое число.
212 * decl -- текущая область видимости.
213 * mod -- текущий модуль.
214 * int_type, bool_type, void_type -- стандартные типы.
215 * world_scope -- область видимости "мир" - выше модуля.
216 */
220 struct oberon_context_s
221 {
222 /*** SCANER DATA ***/
230 /*** END SCANER DATA ***/
232 /*** PARSER DATA ***/
235 /*** END PARSER DATA ***/
243 ModuleImportCallback import_module;
245 };
247 enum
248 {
249 MODE_VAR,
250 MODE_INTEGER,
251 MODE_BOOLEAN,
252 MODE_CALL,
253 MODE_INDEX,
254 MODE_FIELD,
255 MODE_DEREF,
256 MODE_NIL
257 };
259 enum
260 {
261 OP_UNARY_MINUS,
262 OP_BITWISE_NOT,
263 OP_LOGIC_NOT,
264 OP_ABS,
266 OP_ADD,
267 OP_SUB,
268 OP_MUL,
269 OP_DIV,
270 OP_MOD,
271 OP_BITWISE_AND,
272 OP_BITWISE_XOR,
273 OP_BITWISE_OP,
274 OP_LOGIC_AND,
275 OP_LOGIC_OR,
277 OP_EQ,
278 OP_NEQ,
279 OP_LSS,
280 OP_LEQ,
281 OP_GRT,
282 OP_GEQ
283 };
285 struct oberon_item_s
286 {
300 };
302 struct oberon_oper_s
303 {
311 };
313 union oberon_expr_u
314 {
319 };
321 oberon_item_t item;
322 oberon_oper_t oper;
323 };