DEADSOFTWARE

becdd78e6cf530ec53d67ab0ce1ed9b86ab818ef
[dsw-obn.git] / oberon.h
1 #ifndef EMBEDED_OBERON_SCRIPT_H
2 #define EMBEDED_OBERON_SCRIPT_H
4 #include <libgccjit.h>
6 /*
7 * Стуктуры данных генератора
8 */
10 typedef struct
11 {
12 gcc_jit_function * gcc_func;
13 } gen_proc_t;
15 typedef struct
16 {
17 gcc_jit_type * gcc_type;
18 } gen_type_t;
20 typedef struct
21 {
22 char stub[16];
23 gcc_jit_lvalue * gcc_lvalue;
24 gcc_jit_param * gcc_param;
25 } gen_var_t;
27 typedef struct
28 {
29 gcc_jit_context * gcc_context;
30 gcc_jit_block * gcc_block;
31 gcc_jit_result * gcc_result;
32 } gen_context_t;
34 typedef struct oberon_type_s oberon_type_t;
35 typedef struct oberon_object_s oberon_object_t;
36 typedef struct oberon_module_s oberon_module_t;
37 typedef struct oberon_context_s oberon_context_t;
38 typedef struct oberon_scope_s oberon_scope_t;
40 typedef struct oberon_item_s oberon_item_t;
41 typedef struct oberon_oper_s oberon_oper_t;
42 typedef union oberon_expr_u oberon_expr_t;
44 /*
45 * Структура oberon_scope_s (oberon_type_t) реализует стекообразную
46 * область видимости объектов.
47 * Поля:
48 * ctx -- контекст в котором область видимости была создана;
49 * list -- список объявлений. Первый элемент всегда существует,
50 * но не используется и должен быть пропущен.
51 * up -- ссылка на облась видимости уровнем выше.
52 */
54 struct oberon_scope_s
55 {
56 oberon_context_t * ctx;
57 oberon_object_t * list;
58 oberon_scope_t * up;
59 };
61 /*
62 * Формы типов данных.
63 * Тип VOID используется как заглушка возврата типа в обычных процедурах
64 */
66 enum
67 {
68 OBERON_TYPE_VOID,
69 OBERON_TYPE_INTEGER,
70 OBERON_TYPE_BOOLEAN,
71 OBERON_TYPE_PROCEDURE,
72 OBERON_TYPE_ARRAY
73 };
75 /*
76 * Структура oberon_type_s (oberon_type_t) описывает типы данных.
77 * Поля:
78 * class -- Форма типа данных (OBERON_TYPE_*).
79 * size -- Размер примитива в байтах или количество ячеек массива.
80 * Ноль для открытых массивов.
81 * num_decl -- Количество объявленых полей в структуре или сигнатуре процедуры.
82 * base -- Базовый тип структуры или тип возврата процедуры.
83 * decl -- Список объявлений. Перебор начинается с первого элемента.
84 *
85 * Таблица использования полей:
86 * class size num_decl base decl
87 * VOID - - - -
88 * INT + - - -
89 * BOOL + - - -
90 * PROC - + + +
91 */
93 struct oberon_type_s
94 {
95 int class;
96 int size;
98 int dim;
100 int num_decl;
101 oberon_type_t * base;
102 oberon_object_t * decl;
104 gen_type_t * gen_type;
105 };
107 /*
108 * Классы объектов.
109 * VAR -- переменная.
110 * TYPE -- тип данных.
111 * PROC -- процедура.
112 * PARAM -- параметр процедуры.
113 * VAR_PARAM -- VAR-параметр процедуры.
114 */
116 enum
118 OBERON_CLASS_VAR,
119 OBERON_CLASS_TYPE,
120 OBERON_CLASS_PROC,
121 OBERON_CLASS_PARAM,
122 OBERON_CLASS_VAR_PARAM,
123 OBERON_CLASS_CONST
124 };
126 /*
127 * Структура oberon_object_s (oberon_object_t) описывает все
128 * объявления которые могут иметь имя. От констант, до процедур.
129 * Поля:
130 * name -- имя объекта.
131 * class -- класс объекта (OBERON_CLASS_*).
132 * type -- ссылка на тип переменной, дескриптор типа или сигнатуру процедуры.
133 * next -- ссылка на следующий объект в списке.
134 */
136 struct oberon_object_s
138 char * name;
139 int class;
141 oberon_type_t * type;
142 oberon_item_t * value;
143 oberon_object_t * next;
145 gen_var_t * gen_var;
146 gen_proc_t * gen_proc;
147 };
149 /*
150 * Структура oberon_module_s (oberon_module_t) описывает объявление модуля.
151 * Поля:
152 * name -- настоящее имя модуля.
153 * decl -- все глобальные объявления в модуле.
154 * begin -- Указатель на сгенерированный код тела модуля (секция BEGIN).
155 */
157 struct oberon_module_s
159 char * name;
161 oberon_scope_t * decl;
163 void (* begin)();
164 };
166 /*
167 * Структура oberon_context_s (oberon_context_t) учитывает текущее состояние интерпретатора.
168 * Один экземпляр не может использоваться в нескольких потоках одновременно.
169 * Поля:
170 * code -- входной буффер для сканера.
171 * code_index -- Текущая позия в буффере.
172 * с -- последний прочитанный символ.
173 * token -- последний прочитанный токен.
174 * string -- буфер с прочитанной строкой / идентификатором.
175 * всегда имеет уникальный адрес и может изменяться.
176 * integer -- прочитанное целое число.
177 * decl -- текущая область видимости.
178 * mod -- текущий модуль.
179 * int_type, bool_type, void_type -- стандартные типы.
180 * world_scope -- область видимости "мир" - выше модуля.
181 */
183 struct oberon_context_s
185 const char * code;
186 int code_index;
188 char c;
189 int token;
190 char * string;
191 int integer;
193 int has_return;
194 oberon_type_t * result_type;
196 oberon_scope_t * decl;
197 oberon_module_t * mod;
199 oberon_type_t * int_type;
200 oberon_type_t * bool_type;
201 oberon_type_t * void_type;
202 oberon_scope_t * world_scope;
204 gen_context_t * gen_context;
205 };
207 enum
209 MODE_VAR,
210 MODE_INTEGER,
211 MODE_BOOLEAN,
212 MODE_CALL
213 };
215 enum
217 OP_LOGIC_NOT,
218 OP_UNARY_MINUS,
219 OP_ADD,
220 OP_SUB,
221 OP_MUL,
222 OP_DIV,
223 OP_MOD,
224 OP_LOGIC_AND,
225 OP_LOGIC_OR,
226 OP_EQ,
227 OP_NEQ,
228 OP_LSS,
229 OP_LEQ,
230 OP_GRT,
231 OP_GEQ
232 };
234 struct oberon_item_s
236 int is_item; // == 1
237 oberon_type_t * result;
238 oberon_expr_t * next;
240 int mode;
241 int integer;
242 int boolean;
243 oberon_object_t * var;
245 int num_args;
246 oberon_expr_t * args;
247 };
249 struct oberon_oper_s
251 int is_item; // == 0
252 oberon_type_t * result;
253 oberon_expr_t * next;
255 int op;
256 oberon_expr_t * left;
257 oberon_expr_t * right;
258 };
260 union oberon_expr_u
262 struct {
263 int is_item;
264 oberon_type_t * result;
265 oberon_expr_t * next;
266 };
268 oberon_item_t item;
269 oberon_oper_t oper;
270 };
272 oberon_context_t * oberon_create_context();
273 void oberon_destroy_context(oberon_context_t * ctx);
274 void oberon_register_global_type(oberon_context_t * ctx, oberon_type_t * type);
275 oberon_module_t * oberon_compile_module(oberon_context_t * ctx, const char * code);
276 void oberon_error(oberon_context_t * ctx, const char * fmt, ...);
278 #endif // EMBEDED_OBERON_SCRIPT_H