diff --git a/oberon.h b/oberon.h
index 93f80a8e78dc3fc2ccb5ea306ed26ce54a7c74f6..86f95def78e74ccd07b87b82e8bdeefde13601eb 100644 (file)
--- a/oberon.h
+++ b/oberon.h
#include <libgccjit.h>
-/*
- * Стуктуры данных генератора
- */
+typedef struct gen_proc_s gen_proc_t;
+typedef struct gen_type_s gen_type_t;
+typedef struct gen_var_s gen_var_t;
+typedef struct gen_block_s gen_block_t;
+typedef struct gen_context_s gen_context_t;
-typedef struct
+struct gen_proc_s
{
gcc_jit_function * gcc_func;
-} gen_proc_t;
+};
-typedef struct
+struct gen_type_s
{
gcc_jit_type * gcc_type;
gcc_jit_struct * gcc_struct;
-} gen_type_t;
+};
-typedef struct
+struct gen_var_s
{
gcc_jit_lvalue * gcc_lvalue;
gcc_jit_param * gcc_param;
gcc_jit_field * gcc_field;
-} gen_var_t;
+};
-typedef struct
+struct gen_block_s
{
- gcc_jit_context * gcc_context;
gcc_jit_block * gcc_block;
+ gen_block_t * up;
+};
+
+struct gen_context_s
+{
+ gcc_jit_context * gcc_context;
gcc_jit_result * gcc_result;
-} gen_context_t;
+ gen_block_t * block;
+ unsigned record_count;
+};
typedef struct oberon_type_s oberon_type_t;
typedef struct oberon_object_s oberon_object_t;
oberon_context_t * ctx;
oberon_object_t * list;
oberon_scope_t * up;
+
+ oberon_object_t * parent;
+ int local;
};
/*
OBERON_CLASS_PARAM,
OBERON_CLASS_VAR_PARAM,
OBERON_CLASS_CONST,
- OBERON_CLASS_FIELD
+ OBERON_CLASS_FIELD,
+ OBERON_CLASS_MODULE
};
/*
* next -- ссылка на следующий объект в списке.
*/
+typedef oberon_expr_t * (*GenerateFuncCallback)(oberon_context_t *, int, oberon_expr_t *);
+typedef void (*GenerateProcCallback)(oberon_context_t *, int, oberon_expr_t *);
+
struct oberon_object_s
{
char * name;
int class;
+ int export;
+ int read_only;
+ int local;
int linked;
+ int initialized;
+
+ oberon_object_t * parent;
+
+ oberon_scope_t * scope; // for proc
+ int has_return; // for proc
+ int sysproc;
+ GenerateFuncCallback genfunc;
+ GenerateProcCallback genproc;
+
oberon_type_t * type;
oberon_item_t * value;
oberon_object_t * next;
+ oberon_module_t * module;
+
gen_var_t * gen_var;
gen_proc_t * gen_proc;
};
struct oberon_module_s
{
char * name;
+ int ready;
oberon_scope_t * decl;
- void (* begin)();
+ oberon_module_t * next;
};
/*
* world_scope -- область видимости "мир" - выше модуля.
*/
+typedef const char * (*ModuleImportCallback)(const char * name);
+
struct oberon_context_s
{
+ /*** SCANER DATA ***/
const char * code;
int code_index;
int token;
char * string;
int integer;
+ /*** END SCANER DATA ***/
- int has_return;
- oberon_type_t * result_type;
-
+ /*** PARSER DATA ***/
oberon_scope_t * decl;
oberon_module_t * mod;
+ /*** END PARSER DATA ***/
oberon_type_t * int_type;
oberon_type_t * bool_type;
oberon_type_t * void_type;
+ oberon_type_t * void_ptr_type;
oberon_scope_t * world_scope;
-
+ oberon_module_t * module_list;
+ ModuleImportCallback import_module;
gen_context_t * gen_context;
};
MODE_BOOLEAN,
MODE_CALL,
MODE_INDEX,
- MODE_FIELD
+ MODE_FIELD,
+ MODE_DEREF,
+ MODE_NIL
};
enum
{
- OP_LOGIC_NOT,
OP_UNARY_MINUS,
+ OP_BITWISE_NOT,
+ OP_LOGIC_NOT,
+ OP_ABS,
+
OP_ADD,
OP_SUB,
OP_MUL,
OP_DIV,
OP_MOD,
+ OP_BITWISE_AND,
+ OP_BITWISE_XOR,
+ OP_BITWISE_OP,
OP_LOGIC_AND,
OP_LOGIC_OR,
+
OP_EQ,
OP_NEQ,
OP_LSS,
oberon_oper_t oper;
};
-oberon_context_t * oberon_create_context();
+oberon_context_t * oberon_create_context(ModuleImportCallback import_module);
void oberon_destroy_context(oberon_context_t * ctx);
void oberon_register_global_type(oberon_context_t * ctx, oberon_type_t * type);
oberon_module_t * oberon_compile_module(oberon_context_t * ctx, const char * code);