undar-lang/src/compiler.c

201 lines
4.0 KiB
C

#include "compiler.h"
#include "parser.h"
#define MEMORY_SIZE 1024
Code *demo_add_compile() {
Code *code = (Code *)malloc(sizeof(Code));
Value memory[MEMORY_SIZE] = {0}; /* Memory array */
code->memory = memory;
code->size = MEMORY_SIZE;
code->current.pc = 1;
uint32_t 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(OP_LOADU, 0, 0, 0);
memory[i++].u = 0;
memory[i++].u = OP(OP_LOADU, 1, 0, 0);
memory[i++].u = 5;
memory[i++].u = OP(OP_LOADU, 2, 0, 0);
memory[i++].u = 1;
memory[i++].u = OP(OP_LOADF, 3, 0, 0);
memory[i++].f = 5.0f;
memory[i++].u = OP(OP_LOADF, 4, 0, 0);
memory[i++].f = 5.0f;
memory[i++].u = OP(OP_LOADU, 5, 0, 0);
memory[i++].u = 200;
memory[i++].u = OP(OP_LOADU, 6, 0, 0);
memory[i++].u = 250;
memory[i++].u = OP(OP_LOADU, 7, 0, 0);
memory[i++].u = 252;
uint32_t jmp = i;
memory[i++].u = OP(OP_ADD_REAL, 4, 4, 3);
memory[i++].u = OP(OP_SUB_UINT, 1, 1, 2);
memory[i++].u = OP(OP_JGT_UINT, jmp, 1, 0);
memory[i++].u = OP(OP_REAL_TO_STRING, 5, 4, 0);
memory[i++].u = OP(OP_PRINT_STRING, 0, 5, 0);
memory[i++].u = OP(OP_REAL_TO_UINT, 1, 4, 4);
memory[i++].u = OP(OP_UINT_TO_STRING, 6, 1, 0);
memory[i++].u = OP(OP_PRINT_STRING, 0, 6, 0);
memory[i++].u = OP(OP_READ_STRING, 7, 0, 0);
memory[i++].u = OP(OP_PRINT_STRING, 0, 7, 0);
memory[i++].u = OP(OP_HALT, 0, 0, 0);
return code;
}
Code *compile(char *buffer) {
Code *code = (Code *)malloc(sizeof(Code));
Value 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';
initTokenizer(buffer);
Token t = nextToken();
do {
debug_printToken(t);
switch (t.type) {
case TOKEN_LEFT_PAREN:
break;
case TOKEN_RIGHT_PAREN:
break;
case TOKEN_LEFT_BRACE:
break;
case TOKEN_RIGHT_BRACE:
break;
case TOKEN_SEMICOLON:
break;
case TOKEN_IDENTIFIER:
break;
case TOKEN_STRING:
break;
case TOKEN_FLOAT:
break;
case TOKEN_U8:
break;
case TOKEN_I8:
break;
case TOKEN_U16:
break;
case TOKEN_I16:
break;
case TOKEN_U64:
break;
case TOKEN_I64:
break;
case TOKEN_INT:
break;
case TOKEN_UINT:
break;
case TOKEN_FALSE:
break;
case TOKEN_TRUE:
break;
case TOKEN_NULL:
break;
case TOKEN_EOF:
break;
case TOKEN_ERROR:
break;
case TOKEN_ADD:
break;
case TOKEN_SUB:
break;
case TOKEN_MUL:
break;
case TOKEN_DIV:
break;
case TOKEN_MOD:
break;
case TOKEN_GT:
break;
case TOKEN_LT:
break;
case TOKEN_EQ:
break;
case TOKEN_GE:
break;
case TOKEN_LE:
break;
case TOKEN_NE:
break;
case TOKEN_AND:
break;
case TOKEN_OR:
break;
case TOKEN_XOR:
break;
case TOKEN_SHIFTRIGHT:
break;
case TOKEN_SHIFTLEFT:
break;
case TOKEN_FN:
break;
case TOKEN_TO:
break;
case TOKEN_IN:
break;
case TOKEN_IS:
break;
case TOKEN_AS:
break;
case TOKEN_USE:
break;
case TOKEN_IF:
break;
case TOKEN_ELSE:
break;
case TOKEN_DEFAULT:
break;
case TOKEN_FOR:
break;
case TOKEN_TRY:
break;
case TOKEN_CATCH:
break;
case TOKEN_WHILE:
break;
case TOKEN_DO:
break;
case TOKEN_EXIT:
break;
case TOKEN_SWITCH:
break;
case TOKEN_RETURN:
break;
case TOKEN_CONST:
break;
case TOKEN_TYPE:
break;
case TOKEN_THIS:
break;
case TOKEN_YIELD:
break;
case TOKEN_CASE:
break;
case TOKEN_ASSERT:
break;
case TOKEN_BREAK:
break;
case TOKEN_LET:
break;
case TOKEN_PRINT:
break;
default:
break;
}
t = nextToken();
} while (t.type != TOKEN_EOF);
return code;
}