DEADSOFTWARE

Добавлены процедуры и проверка результата в выражениях
[dsw-obn.git] / oberon.h
index ec742c6bd7af90c18b3850a37fe2163b12407de4..b2f0965f3c6acadd009dd22e99d4e5a1df8bc270 100644 (file)
--- a/oberon.h
+++ b/oberon.h
@@ -3,6 +3,7 @@
 
 typedef struct oberon_var_s oberon_var_t;
 typedef struct oberon_type_s oberon_type_t;
+typedef struct oberon_proc_s oberon_proc_t;
 typedef struct oberon_module_s oberon_module_t;
 typedef struct oberon_context_s oberon_context_t;
 
@@ -30,10 +31,21 @@ struct oberon_var_s
        void * gen_var;
 };
 
+struct oberon_proc_s
+{
+       char * name;
+
+       oberon_proc_t * next;
+
+       void * gen_proc;
+};
+
 struct oberon_module_s
 {
        char * name;
+
        oberon_var_t * vars;
+       oberon_proc_t * procs;
 
        void (* begin)();
 };
@@ -51,6 +63,9 @@ struct oberon_context_s
        oberon_module_t * mod;
        oberon_type_t * types;
 
+       oberon_type_t * int_type;
+       oberon_type_t * bool_type;
+
        void * gen_context;
 };
 
@@ -60,13 +75,59 @@ enum {
        MODE_BOOLEAN
 };
 
-typedef struct
+enum {
+       OP_LOGIC_NOT,
+       OP_UNARY_MINUS,
+       OP_ADD,
+       OP_SUB,
+       OP_MUL,
+       OP_DIV,
+       OP_MOD,
+       OP_LOGIC_AND,
+       OP_LOGIC_OR,
+       OP_EQ,
+       OP_NEQ,
+       OP_LSS,
+       OP_LEQ,
+       OP_GRT,
+       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;
+       oberon_type_t * result;
+
        int mode;
        int integer;
        int boolean;
        oberon_var_t * var;
-} oberon_item_t;
+};
+
+struct oberon_oper_s
+{
+       int is_item;
+       oberon_type_t * result;
+
+       int op;
+       oberon_expr_t * left;
+       oberon_expr_t * right;
+};
+
+union oberon_expr_u
+{
+       struct {
+               int is_item;
+               oberon_type_t * result;
+       };
+
+       oberon_item_t item;
+       oberon_oper_t oper;
+};
 
 oberon_context_t * oberon_create_context();
 void oberon_destroy_context(oberon_context_t * ctx);