DEADSOFTWARE

Реализованы неявные объявления типов наперёд
[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 gcc_jit_struct * gcc_struct;
19 } gen_type_t;
21 typedef struct
22 {
23 gcc_jit_lvalue * gcc_lvalue;
24 gcc_jit_param * gcc_param;
25 gcc_jit_field * gcc_field;
26 } gen_var_t;
28 typedef struct
29 {
30 gcc_jit_context * gcc_context;
31 gcc_jit_block * gcc_block;
32 gcc_jit_result * gcc_result;
33 } gen_context_t;
35 typedef struct oberon_type_s oberon_type_t;
36 typedef struct oberon_object_s oberon_object_t;
37 typedef struct oberon_module_s oberon_module_t;
38 typedef struct oberon_context_s oberon_context_t;
39 typedef struct oberon_scope_s oberon_scope_t;
41 typedef struct oberon_item_s oberon_item_t;
42 typedef struct oberon_oper_s oberon_oper_t;
43 typedef union oberon_expr_u oberon_expr_t;
45 /*
46 * Структура oberon_scope_s (oberon_type_t) реализует стекообразную
47 * область видимости объектов.
48 * Поля:
49 * ctx -- контекст в котором область видимости была создана;
50 * list -- список объявлений. Первый элемент всегда существует,
51 * но не используется и должен быть пропущен.
52 * up -- ссылка на облась видимости уровнем выше.
53 */
55 struct oberon_scope_s
56 {
57 oberon_context_t * ctx;
58 oberon_object_t * list;
59 oberon_scope_t * up;
60 };
62 /*
63 * Формы типов данных.
64 * Тип VOID используется как заглушка возврата типа в обычных процедурах
65 */
67 enum
68 {
69 OBERON_TYPE_VOID,
70 OBERON_TYPE_INTEGER,
71 OBERON_TYPE_BOOLEAN,
72 OBERON_TYPE_PROCEDURE,
73 OBERON_TYPE_ARRAY,
74 OBERON_TYPE_RECORD,
75 OBERON_TYPE_POINTER
76 };
78 /*
79 * Структура oberon_type_s (oberon_type_t) описывает типы данных.
80 * Поля:
81 * class -- Форма типа данных (OBERON_TYPE_*).
82 * size -- Размер примитива в байтах или количество ячеек массива.
83 * Ноль для открытых массивов.
84 * num_decl -- Количество объявленых полей в структуре или сигнатуре процедуры.
85 * base -- Базовый тип структуры или тип возврата процедуры.
86 * decl -- Список объявлений. Перебор начинается с первого элемента.
87 *
88 * Таблица использования полей:
89 * class size num_decl base decl
90 * VOID - - - -
91 * INT + - - -
92 * BOOL + - - -
93 * PROC - + + +
94 */
96 struct oberon_type_s
97 {
98 int class;
99 int size;
101 int dim;
103 int num_decl;
104 oberon_type_t * base;
105 oberon_object_t * decl;
107 int recursive;
108 int initialized;
109 gen_type_t * gen_type;
110 };
112 /*
113 * Классы объектов.
114 * VAR -- переменная.
115 * TYPE -- тип данных.
116 * PROC -- процедура.
117 * PARAM -- параметр процедуры.
118 * VAR_PARAM -- VAR-параметр процедуры.
119 */
121 enum
123 OBERON_CLASS_VAR,
124 OBERON_CLASS_TYPE,
125 OBERON_CLASS_PROC,
126 OBERON_CLASS_PARAM,
127 OBERON_CLASS_VAR_PARAM,
128 OBERON_CLASS_CONST,
129 OBERON_CLASS_FIELD
130 };
132 /*
133 * Структура oberon_object_s (oberon_object_t) описывает все
134 * объявления которые могут иметь имя. От констант, до процедур.
135 * Поля:
136 * name -- имя объекта.
137 * class -- класс объекта (OBERON_CLASS_*).
138 * type -- ссылка на тип переменной, дескриптор типа или сигнатуру процедуры.
139 * next -- ссылка на следующий объект в списке.
140 */
142 struct oberon_object_s
144 char * name;
145 int class;
147 int linked;
148 oberon_type_t * type;
149 oberon_item_t * value;
150 oberon_object_t * next;
152 gen_var_t * gen_var;
153 gen_proc_t * gen_proc;
154 };
156 /*
157 * Структура oberon_module_s (oberon_module_t) описывает объявление модуля.
158 * Поля:
159 * name -- настоящее имя модуля.
160 * decl -- все глобальные объявления в модуле.
161 * begin -- Указатель на сгенерированный код тела модуля (секция BEGIN).
162 */
164 struct oberon_module_s
166 char * name;
168 oberon_scope_t * decl;
170 void (* begin)();
171 };
173 /*
174 * Структура oberon_context_s (oberon_context_t) учитывает текущее состояние интерпретатора.
175 * Один экземпляр не может использоваться в нескольких потоках одновременно.
176 * Поля:
177 * code -- входной буффер для сканера.
178 * code_index -- Текущая позия в буффере.
179 * с -- последний прочитанный символ.
180 * token -- последний прочитанный токен.
181 * string -- буфер с прочитанной строкой / идентификатором.
182 * всегда имеет уникальный адрес и может изменяться.
183 * integer -- прочитанное целое число.
184 * decl -- текущая область видимости.
185 * mod -- текущий модуль.
186 * int_type, bool_type, void_type -- стандартные типы.
187 * world_scope -- область видимости "мир" - выше модуля.
188 */
190 struct oberon_context_s
192 const char * code;
193 int code_index;
195 char c;
196 int token;
197 char * string;
198 int integer;
200 int has_return;
201 oberon_type_t * result_type;
203 oberon_scope_t * decl;
204 oberon_module_t * mod;
206 oberon_type_t * int_type;
207 oberon_type_t * bool_type;
208 oberon_type_t * void_type;
209 oberon_scope_t * world_scope;
211 gen_context_t * gen_context;
212 };
214 enum
216 MODE_VAR,
217 MODE_INTEGER,
218 MODE_BOOLEAN,
219 MODE_CALL,
220 MODE_INDEX,
221 MODE_FIELD
222 };
224 enum
226 OP_LOGIC_NOT,
227 OP_UNARY_MINUS,
228 OP_ADD,
229 OP_SUB,
230 OP_MUL,
231 OP_DIV,
232 OP_MOD,
233 OP_LOGIC_AND,
234 OP_LOGIC_OR,
235 OP_EQ,
236 OP_NEQ,
237 OP_LSS,
238 OP_LEQ,
239 OP_GRT,
240 OP_GEQ
241 };
243 struct oberon_item_s
245 int is_item; // == 1
246 oberon_type_t * result;
247 oberon_expr_t * next;
249 int mode;
250 int integer;
251 int boolean;
252 oberon_object_t * var;
254 oberon_item_t * parent;
256 int num_args;
257 oberon_expr_t * args;
258 };
260 struct oberon_oper_s
262 int is_item; // == 0
263 oberon_type_t * result;
264 oberon_expr_t * next;
266 int op;
267 oberon_expr_t * left;
268 oberon_expr_t * right;
269 };
271 union oberon_expr_u
273 struct {
274 int is_item;
275 oberon_type_t * result;
276 oberon_expr_t * next;
277 };
279 oberon_item_t item;
280 oberon_oper_t oper;
281 };
283 oberon_context_t * oberon_create_context();
284 void oberon_destroy_context(oberon_context_t * ctx);
285 void oberon_register_global_type(oberon_context_t * ctx, oberon_type_t * type);
286 oberon_module_t * oberon_compile_module(oberon_context_t * ctx, const char * code);
287 void oberon_error(oberon_context_t * ctx, const char * fmt, ...);
289 #endif // EMBEDED_OBERON_SCRIPT_H