I added some code to help with constants but it's not working.

This commit is contained in:
Meyer Simon
2025-04-11 12:51:14 -04:00
parent 58b50ccb63
commit 7296a24c74
3 changed files with 60 additions and 7 deletions

View File

@ -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(); emit_helper();
current->opcode = op; current->opcode = op;
current->result = look_up(cur, result); current->result = result;
current->operand1 = look_up(cur, arg1); current->operand1 = arg1;
current->operand2 = look_up(cur, arg2); current->operand2 = arg2;
return; return;
} }
void emit_unary_op(char* result, Op op, char* arg){ void emit_unary_op(TableNode * result, Op op, TableNode * arg){
emit_helper(); emit_helper();
current->opcode = op; current->opcode = op;
current->result = look_up(cur, result); current->result = result;
current->operand1 = look_up(cur, arg); current->operand1 = arg;
return; return;
} }

View File

@ -35,6 +35,30 @@ typedef enum {
} Op; } 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 { typedef struct Instruction {
Op opcode; Op opcode;
TableNode * result; TableNode * result;

29
test.alpha Normal file
View File

@ -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);
}