diff --git a/src/intermediate_code.c b/src/intermediate_code.c index c1e5980..c7938ec 100644 --- a/src/intermediate_code.c +++ b/src/intermediate_code.c @@ -23,20 +23,20 @@ void emit_helper(void){ } } - void emit_binary_op(char* result, Op op, char* arg1, char* arg2){ + void emit_binary_op(TableNode * result, Op op, TableNode * arg1, TableNode * arg2){ emit_helper(); current->opcode = op; - current->result = look_up(cur, result); - current->operand1 = look_up(cur, arg1); - current->operand2 = look_up(cur, arg2); + current->result = result; + current->operand1 = arg1; + current->operand2 = arg2; return; } - void emit_unary_op(char* result, Op op, char* arg){ + void emit_unary_op(TableNode * result, Op op, TableNode * arg){ emit_helper(); current->opcode = op; - current->result = look_up(cur, result); - current->operand1 = look_up(cur, arg); + current->result = result; + current->operand1 = arg; return; } diff --git a/src/intermediate_code.h b/src/intermediate_code.h index 499d4c3..6266b79 100644 --- a/src/intermediate_code.h +++ b/src/intermediate_code.h @@ -35,6 +35,30 @@ typedef enum { } Op; + +typedef enum { + NODE, + INTEGER, + STRING, + CHARACTER, + ADDRESS, + BOOLEAN +} Discriminant; + +typedef union { + TableNode * node; + int integer; + char * string; + char character; + void * address; + bool Boolean; +} Register_union; + +typedef struct { + Discriminant d; + Register_union r_union; +} TNodeOrConst; + typedef struct Instruction { Op opcode; TableNode * result; diff --git a/test.alpha b/test.alpha new file mode 100644 index 0000000..7b06a5e --- /dev/null +++ b/test.alpha @@ -0,0 +1,29 @@ + + + +type a : 1 -> integers +type t : integer -> a +type r : integer -> integer + + + +function foo : t +function bar : r +function entry : + +bar(a) := { + 5 + bar(a - 1); + return a * bar(a-1); +} + +foo(c) := { + [a: arg] + arg := reserve arg(c); + return arg; +} + +entry(args) := { + [a: b] + b := foo(8); +} +