reality-engine/src/compiler.c

131 lines
2.9 KiB
C

#include "compiler.h"
#include "parser.h"
#define MEMORY_SIZE 1024
Code *demo_add_compile() {
Code *code = (Code *)malloc(sizeof(Code));
Word memory[MEMORY_SIZE] = {0}; /* Memory array */
code->memory = memory;
code->size = MEMORY_SIZE;
int i = 1;
memory[0].c[0] = 0;
memory[0].c[1] = 'z';
memory[0].c[2] = 'r';
memory[0].c[3] = 'e';
memory[i++].u = OP_ADD_REAL;
memory[i++].u = 102;
memory[i++].u = 103;
memory[i++].u = 103;
memory[i++].u = OP_SUB_UINT;
memory[i++].u = 100;
memory[i++].u = 101;
memory[i++].u = 100;
memory[i++].u = OP_JGT_UINT;
memory[i++].u = 100;
memory[i++].u = 99;
memory[i++].u = 1;
memory[i++].u = OP_REAL_TO_STRING;
memory[i++].u = 103;
memory[i++].u = 1;
memory[i++].u = 200;
memory[i++].u = OP_PRINT_STRING;
memory[i++].u = 201;
memory[i++].u = 1;
memory[i++].u = 1;
memory[i++].u = OP_REAL_TO_UINT;
memory[i++].u = 103;
memory[i++].u = 1;
memory[i++].u = 103;
memory[i++].u = OP_UINT_TO_STRING;
memory[i++].u = 103;
memory[i++].u = 1;
memory[i++].u = 104;
memory[i++].u = OP_PRINT_STRING;
memory[i++].u = 105;
memory[i++].u = 1;
memory[i++].u = 1;
memory[i++].u = OP_READ_STRING;
memory[i++].u = 1;
memory[i++].u = 1;
memory[i++].u = 109;
memory[i++].u = OP_PRINT_STRING;
memory[i++].u = 110;
memory[i++].u = 1;
memory[i++].u = 1;
memory[i++].u = OP_HALT;
memory[i++].u = 0;
memory[i++].u = 0;
memory[i++].u = 0;
memory[99].u = 0;
memory[100].u = 5;
memory[101].u = 1;
memory[102].q = FLOAT_TO_Q16_16(5.0f);
memory[103].q = FLOAT_TO_Q16_16(5.0f);
return code;
}
Code *compile(char *buffer) {
Code *code = (Code *)malloc(sizeof(Code));
Word memory[MEMORY_SIZE] = {0}; /* Memory array */
code->memory = memory;
code->size = MEMORY_SIZE;
/* char number[100]; */
memory[0].c[0] = 0;
memory[0].c[1] = 'z';
memory[0].c[2] = 'r';
memory[0].c[3] = 'e';
new_Tokenizer(buffer);
Token t = nextToken();
do {
debug_printToken(t);
switch (t.type) {
case TOKEN_PRINT:
case TOKEN_ADD:
case TOKEN_INT:
/* strncpy(number, t.start, t.length); */
/* number[t.length + 1] = '\0'; */
/* int i = strtol(number, NULL, 10); */
/* memory[ptr].i = i; */
/* break; */
case TOKEN_LEFT_PAREN:
case TOKEN_RIGHT_PAREN:
case TOKEN_LEFT_BRACE:
case TOKEN_RIGHT_BRACE:
case TOKEN_IDENTIFIER:
case TOKEN_STRING:
case TOKEN_FLOAT:
case TOKEN_UINT:
case TOKEN_SUB:
case TOKEN_MUL:
case TOKEN_DIV:
case TOKEN_FALSE:
case TOKEN_TRUE:
case TOKEN_EOF:
case TOKEN_ERROR:
case TOKEN_MOD:
case TOKEN_GT:
case TOKEN_LT:
case TOKEN_EQ:
case TOKEN_GE:
case TOKEN_LE:
case TOKEN_NE:
case TOKEN_NULL:
case TOKEN_AND:
case TOKEN_OR:
case TOKEN_XOR:
case TOKEN_SHIFTRIGHT:
case TOKEN_SHIFTLEFT:
default:
break;
}
t = nextToken();
} while (t.type != TOKEN_EOF);
return code;
}