02547cd70be76f7ffdaeb60097fa5fe89cc5dd87
1 #ifndef EMBEDED_OBERON_SCRIPT_H
2 #define EMBEDED_OBERON_SCRIPT_H
4 #include <libgccjit.h>
6 /*
7 * Стуктуры данных генератора
8 */
11 {
16 {
22 {
29 {
45 /*
46 * Структура oberon_scope_s (oberon_type_t) реализует стекообразную
47 * область видимости объектов.
48 * Поля:
49 * ctx -- контекст в котором область видимости была создана;
50 * list -- список объявлений. Первый элемент всегда существует,
51 * но не используется и должен быть пропущен.
52 * up -- ссылка на облась видимости уровнем выше.
53 */
55 struct oberon_scope_s
56 {
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 {
108 };
110 /*
111 * Классы объектов.
112 * VAR -- переменная.
113 * TYPE -- тип данных.
114 * PROC -- процедура.
115 * PARAM -- параметр процедуры.
116 * VAR_PARAM -- VAR-параметр процедуры.
117 */
119 enum
120 {
121 OBERON_CLASS_VAR,
122 OBERON_CLASS_TYPE,
123 OBERON_CLASS_PROC,
124 OBERON_CLASS_PARAM,
125 OBERON_CLASS_VAR_PARAM,
126 OBERON_CLASS_CONST,
127 OBERON_CLASS_FIELD
128 };
130 /*
131 * Структура oberon_object_s (oberon_object_t) описывает все
132 * объявления которые могут иметь имя. От констант, до процедур.
133 * Поля:
134 * name -- имя объекта.
135 * class -- класс объекта (OBERON_CLASS_*).
136 * type -- ссылка на тип переменной, дескриптор типа или сигнатуру процедуры.
137 * next -- ссылка на следующий объект в списке.
138 */
140 struct oberon_object_s
141 {
152 };
154 /*
155 * Структура oberon_module_s (oberon_module_t) описывает объявление модуля.
156 * Поля:
157 * name -- настоящее имя модуля.
158 * decl -- все глобальные объявления в модуле.
159 * begin -- Указатель на сгенерированный код тела модуля (секция BEGIN).
160 */
162 struct oberon_module_s
163 {
169 };
171 /*
172 * Структура oberon_context_s (oberon_context_t) учитывает текущее состояние интерпретатора.
173 * Один экземпляр не может использоваться в нескольких потоках одновременно.
174 * Поля:
175 * code -- входной буффер для сканера.
176 * code_index -- Текущая позия в буффере.
177 * с -- последний прочитанный символ.
178 * token -- последний прочитанный токен.
179 * string -- буфер с прочитанной строкой / идентификатором.
180 * всегда имеет уникальный адрес и может изменяться.
181 * integer -- прочитанное целое число.
182 * decl -- текущая область видимости.
183 * mod -- текущий модуль.
184 * int_type, bool_type, void_type -- стандартные типы.
185 * world_scope -- область видимости "мир" - выше модуля.
186 */
188 struct oberon_context_s
189 {
211 };
213 enum
214 {
215 MODE_VAR,
216 MODE_INTEGER,
217 MODE_BOOLEAN,
218 MODE_CALL,
219 MODE_INDEX,
220 MODE_FIELD,
221 MODE_DEREF,
222 MODE_NIL
223 };
225 enum
226 {
227 OP_LOGIC_NOT,
228 OP_UNARY_MINUS,
229 OP_ADD,
230 OP_SUB,
231 OP_MUL,
232 OP_DIV,
233 OP_MOD,
234 OP_LOGIC_AND,
235 OP_LOGIC_OR,
236 OP_EQ,
237 OP_NEQ,
238 OP_LSS,
239 OP_LEQ,
240 OP_GRT,
241 OP_GEQ
242 };
244 struct oberon_item_s
245 {
259 };
261 struct oberon_oper_s
262 {
270 };
272 union oberon_expr_u
273 {
278 };
280 oberon_item_t item;
281 oberon_oper_t oper;
282 };