DEADSOFTWARE

Добавлены процедуры-функции, объявления именованных констант, объявления типов алиасо...
[dsw-obn.git] / oberon.h
index f29aa4d4a780b18af1a526bcbc9556580f3d94ff..becdd78e6cf530ec53d67ab0ce1ed9b86ab818ef 100644 (file)
--- a/oberon.h
+++ b/oberon.h
@@ -1,12 +1,56 @@
 #ifndef EMBEDED_OBERON_SCRIPT_H
 #define EMBEDED_OBERON_SCRIPT_H
 
+#include <libgccjit.h>
+
+/*
+ * Стуктуры данных генератора
+ */
+
+typedef struct
+{
+       gcc_jit_function * gcc_func;
+} gen_proc_t;
+
+typedef struct
+{
+       gcc_jit_type * gcc_type;
+} gen_type_t;
+
+typedef struct
+{
+        char stub[16];
+        gcc_jit_lvalue * gcc_lvalue;
+        gcc_jit_param * gcc_param;
+} gen_var_t;
+
+typedef struct
+{
+        gcc_jit_context * gcc_context;
+        gcc_jit_block * gcc_block;
+        gcc_jit_result * gcc_result;
+} gen_context_t;
+
 typedef struct oberon_type_s oberon_type_t;
 typedef struct oberon_object_s oberon_object_t;
 typedef struct oberon_module_s oberon_module_t;
 typedef struct oberon_context_s oberon_context_t;
 typedef struct oberon_scope_s oberon_scope_t;
 
+typedef struct oberon_item_s oberon_item_t;
+typedef struct oberon_oper_s oberon_oper_t;
+typedef union oberon_expr_u oberon_expr_t;
+
+/*
+ * Структура oberon_scope_s (oberon_type_t) реализует стекообразную
+ * область видимости объектов.
+ * Поля:
+ *   ctx  -- контекст в котором область видимости была создана;
+ *   list -- список объявлений. Первый элемент всегда существует,
+ *           но не используется и должен быть пропущен.
+ *   up   -- ссылка на облась видимости уровнем выше.
+ */
+
 struct oberon_scope_s
 {
        oberon_context_t * ctx;
@@ -14,40 +58,102 @@ struct oberon_scope_s
        oberon_scope_t * up;
 };
 
+/*
+ * Формы типов данных.
+ * Тип VOID используется как заглушка возврата типа в обычных процедурах
+ */
+
 enum
 {
+       OBERON_TYPE_VOID,
        OBERON_TYPE_INTEGER,
        OBERON_TYPE_BOOLEAN,
+       OBERON_TYPE_PROCEDURE,
+       OBERON_TYPE_ARRAY
 };
 
+/*
+ * Структура oberon_type_s (oberon_type_t) описывает типы данных.
+ * Поля:
+ *   class -- Форма типа данных (OBERON_TYPE_*).
+ *   size  -- Размер примитива в байтах или количество ячеек массива.
+ *            Ноль для открытых массивов.
+ *   num_decl -- Количество объявленых полей в структуре или сигнатуре процедуры.
+ *   base  -- Базовый тип структуры или тип возврата процедуры.
+ *   decl -- Список объявлений. Перебор начинается с первого элемента.
+ *
+ * Таблица использования полей:
+ *   class size num_decl base decl
+ *   VOID  -    -        -    -
+ *   INT   +    -        -    -
+ *   BOOL  +    -        -    -
+ *   PROC  -    +        +    +
+ */
+
 struct oberon_type_s
 {
        int class;
        int size;
 
-       void * gen_type;
+       int dim;
+
+       int num_decl;
+       oberon_type_t * base;
+       oberon_object_t * decl;
+
+       gen_type_t * gen_type;
 };
 
+/*
+ * Классы объектов.
+ *   VAR -- переменная.
+ *   TYPE -- тип данных.
+ *   PROC -- процедура.
+ *   PARAM -- параметр процедуры.
+ *   VAR_PARAM -- VAR-параметр процедуры.
+ */
+
 enum
 {
        OBERON_CLASS_VAR,
        OBERON_CLASS_TYPE,
-       OBERON_CLASS_PROC
+       OBERON_CLASS_PROC,
+       OBERON_CLASS_PARAM,
+       OBERON_CLASS_VAR_PARAM,
+       OBERON_CLASS_CONST
 };
 
+/*
+ * Структура oberon_object_s (oberon_object_t) описывает все
+ * объявления которые могут иметь имя. От констант, до процедур.
+ * Поля:
+ *   name -- имя объекта.
+ *   class -- класс объекта (OBERON_CLASS_*).
+ *   type -- ссылка на тип переменной, дескриптор типа или сигнатуру процедуры.
+ *   next -- ссылка на следующий объект в списке.
+ */
+
 struct oberon_object_s
 {
        char * name;
        int class;
 
        oberon_type_t * type;
-
-       void * gen_var;
-       void * gen_proc;
-
+       oberon_item_t * value;
        oberon_object_t * next;
+
+       gen_var_t * gen_var;
+       gen_proc_t * gen_proc;
 };
 
+/*
+ * Структура oberon_module_s (oberon_module_t) описывает объявление модуля.
+ * Поля:
+ *   name -- настоящее имя модуля.
+ *   decl -- все глобальные объявления в модуле.
+ *   begin -- Указатель на сгенерированный код тела модуля (секция BEGIN).
+ */
+
 struct oberon_module_s
 {
        char * name;
@@ -57,6 +163,23 @@ struct oberon_module_s
        void (* begin)();
 };
 
+/*
+ * Структура oberon_context_s (oberon_context_t) учитывает текущее состояние интерпретатора.
+ * Один экземпляр не может использоваться в нескольких потоках одновременно.
+ * Поля:
+ *   code    -- входной буффер для сканера.
+ *   code_index -- Текущая позия в буффере.
+ *   с       -- последний прочитанный символ.
+ *   token   -- последний прочитанный токен.
+ *   string  -- буфер с прочитанной строкой / идентификатором.
+ *              всегда имеет уникальный адрес и может изменяться.
+ *   integer -- прочитанное целое число.
+ *   decl    -- текущая область видимости.
+ *   mod     -- текущий модуль.
+ *   int_type, bool_type, void_type -- стандартные типы.
+ *   world_scope -- область видимости "мир" - выше модуля.
+ */
+
 struct oberon_context_s
 {
        const char * code;
@@ -67,24 +190,30 @@ struct oberon_context_s
        char * string;
        int integer;
 
+       int has_return;
+       oberon_type_t * result_type;
+
        oberon_scope_t * decl;
        oberon_module_t * mod;
 
        oberon_type_t * int_type;
        oberon_type_t * bool_type;
+       oberon_type_t * void_type;
        oberon_scope_t * world_scope;
 
-       void * gen_context;
+       gen_context_t * gen_context;
 };
 
-enum {
+enum
+{
        MODE_VAR,
        MODE_INTEGER,
        MODE_BOOLEAN,
        MODE_CALL
 };
 
-enum {
+enum
+{
        OP_LOGIC_NOT,
        OP_UNARY_MINUS,
        OP_ADD,
@@ -102,25 +231,26 @@ enum {
        OP_GEQ
 };
 
-typedef struct oberon_item_s oberon_item_t;
-typedef struct oberon_oper_s oberon_oper_t;
-typedef union oberon_expr_u oberon_expr_t;
-
 struct oberon_item_s
 {
-       int is_item;
+       int is_item; // == 1
        oberon_type_t * result;
+       oberon_expr_t * next;
 
        int mode;
        int integer;
        int boolean;
        oberon_object_t * var;
+
+       int num_args;
+       oberon_expr_t * args;
 };
 
 struct oberon_oper_s
 {
-       int is_item;
+       int is_item; // == 0
        oberon_type_t * result;
+       oberon_expr_t * next;
 
        int op;
        oberon_expr_t * left;
@@ -132,6 +262,7 @@ union oberon_expr_u
        struct {
                int is_item;
                oberon_type_t * result;
+               oberon_expr_t * next;
        };
 
        oberon_item_t item;