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 {
41 };
53 /*
54 * Структура oberon_scope_s (oberon_type_t) реализует стекообразную
55 * область видимости объектов.
56 * Поля:
57 * ctx -- контекст в котором область видимости была создана;
58 * list -- список объявлений. Первый элемент всегда существует,
59 * но не используется и должен быть пропущен.
60 * up -- ссылка на облась видимости уровнем выше.
61 */
63 struct oberon_scope_s
64 {
71 };
73 /*
74 * Формы типов данных.
75 * Тип VOID используется как заглушка возврата типа в обычных процедурах
76 */
78 enum
79 {
80 OBERON_TYPE_VOID,
81 OBERON_TYPE_INTEGER,
82 OBERON_TYPE_BOOLEAN,
83 OBERON_TYPE_PROCEDURE,
84 OBERON_TYPE_ARRAY,
85 OBERON_TYPE_RECORD,
86 OBERON_TYPE_POINTER
87 };
89 /*
90 * Структура oberon_type_s (oberon_type_t) описывает типы данных.
91 * Поля:
92 * class -- Форма типа данных (OBERON_TYPE_*).
93 * size -- Размер примитива в байтах или количество ячеек массива.
94 * Ноль для открытых массивов.
95 * num_decl -- Количество объявленых полей в структуре или сигнатуре процедуры.
96 * base -- Базовый тип структуры или тип возврата процедуры.
97 * decl -- Список объявлений. Перебор начинается с первого элемента.
98 *
99 * Таблица использования полей:
100 * class size num_decl base decl
101 * VOID - - - -
102 * INT + - - -
103 * BOOL + - - -
104 * PROC - + + +
105 */
107 struct oberon_type_s
108 {
119 };
121 /*
122 * Классы объектов.
123 * VAR -- переменная.
124 * TYPE -- тип данных.
125 * PROC -- процедура.
126 * PARAM -- параметр процедуры.
127 * VAR_PARAM -- VAR-параметр процедуры.
128 */
130 enum
131 {
132 OBERON_CLASS_VAR,
133 OBERON_CLASS_TYPE,
134 OBERON_CLASS_PROC,
135 OBERON_CLASS_PARAM,
136 OBERON_CLASS_VAR_PARAM,
137 OBERON_CLASS_CONST,
138 OBERON_CLASS_FIELD
139 };
141 /*
142 * Структура oberon_object_s (oberon_object_t) описывает все
143 * объявления которые могут иметь имя. От констант, до процедур.
144 * Поля:
145 * name -- имя объекта.
146 * class -- класс объекта (OBERON_CLASS_*).
147 * type -- ссылка на тип переменной, дескриптор типа или сигнатуру процедуры.
148 * next -- ссылка на следующий объект в списке.
149 */
151 struct oberon_object_s
152 {
170 };
172 /*
173 * Структура oberon_module_s (oberon_module_t) описывает объявление модуля.
174 * Поля:
175 * name -- настоящее имя модуля.
176 * decl -- все глобальные объявления в модуле.
177 * begin -- Указатель на сгенерированный код тела модуля (секция BEGIN).
178 */
180 struct oberon_module_s
181 {
187 };
189 /*
190 * Структура oberon_context_s (oberon_context_t) учитывает текущее состояние интерпретатора.
191 * Один экземпляр не может использоваться в нескольких потоках одновременно.
192 * Поля:
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 -- область видимости "мир" - выше модуля.
204 */
206 struct oberon_context_s
207 {
226 };
228 enum
229 {
230 MODE_VAR,
231 MODE_INTEGER,
232 MODE_BOOLEAN,
233 MODE_CALL,
234 MODE_INDEX,
235 MODE_FIELD,
236 MODE_DEREF,
237 MODE_NIL
238 };
240 enum
241 {
242 OP_LOGIC_NOT,
243 OP_UNARY_MINUS,
244 OP_ADD,
245 OP_SUB,
246 OP_MUL,
247 OP_DIV,
248 OP_MOD,
249 OP_LOGIC_AND,
250 OP_LOGIC_OR,
251 OP_EQ,
252 OP_NEQ,
253 OP_LSS,
254 OP_LEQ,
255 OP_GRT,
256 OP_GEQ
257 };
259 struct oberon_item_s
260 {
274 };
276 struct oberon_oper_s
277 {
285 };
287 union oberon_expr_u
288 {
293 };
295 oberon_item_t item;
296 oberon_oper_t oper;
297 };