diff --git a/README.md b/README.md index c19d7c1..9e8570a 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ But uhh that's the name of the VM itself, the name of the programming language I made is Sylt, named after the German island. -To compile for Linux: `gcc src/main.c src/vmbl.c src/exception.c -o VMBL -O3` +To compile for Linux: `gcc src/main.c src/vmbl.c src/exception.c src/asm/tokenize.c -o VMBL -O3` ## Syntax ### Example "Hello, World!" Program diff --git a/src/asm/tokenize.c b/src/asm/tokenize.c new file mode 100644 index 0000000..b27750a --- /dev/null +++ b/src/asm/tokenize.c @@ -0,0 +1,56 @@ +#include "tokenize.h" +#include +#include + + +char *parseName(Tokenizer *tokenizer) { + char *ptr = tokenizer->source; + + int i = 0; + while (isName(*ptr++)) + { + i++; + } + + printf("%d\n", i); + return "hi"; + +} + +bool isNumber(char character) { + return isalnum(character) || character == '.'; +} + +bool isName(char character) { + return isalnum(character) || character == '_'; +} + +Token getCurrentToken(Tokenizer *tokenizer) { + Token token = (Token){}; + + switch (*tokenizer->source) + { + default: + if (isName(*tokenizer->source)) { + char *tokenValue = parseName(tokenizer); + } + + break; + } +} + +char* tokenTypeAsCStr(TokenType type) { + switch (type) + { + case TOKEN_INSTRUCTION: + return "INSTRUCTION"; + break; + + case TOKEN_INT_LITERAL: + return "INT_LITERAL"; + break; + + default: + break; + } +} \ No newline at end of file diff --git a/src/asm/tokenize.h b/src/asm/tokenize.h new file mode 100644 index 0000000..b2e17ce --- /dev/null +++ b/src/asm/tokenize.h @@ -0,0 +1,33 @@ +#ifndef TOKENIZE_H +#define TOKENIZE_H + +#include + +typedef enum +{ + TOKEN_INSTRUCTION, + TOKEN_INT_LITERAL, +} TokenType; + +typedef struct +{ + TokenType type; + char* value; +} Token; + +typedef struct +{ + char *source; + unsigned int pos; + unsigned int line; + unsigned int column; +} Tokenizer; + +bool isNumber(char character); +bool isName(char character); +Token getCurrentToken(Tokenizer *tokenizer); +char* tokenTypeAsCStr(TokenType type); + +char *parseName(Tokenizer *tokenizer); + +#endif // !TOKENIZE_H diff --git a/src/main.c b/src/main.c index babaa1f..ab015f4 100644 --- a/src/main.c +++ b/src/main.c @@ -1,19 +1,28 @@ #include "vmbl.h" +#include "asm/tokenize.h" +#include #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])); VMBL_Instruction program[] = { - MAKE_INST_PUSH(123), - MAKE_INST_PUSH(0), + MAKE_INST_PUSH(124), + MAKE_INST_PUSH(2), MAKE_INST_DIV, - + MAKE_INST_HALT }; int main() { - VMBL_State vmblState = {}; + //VMBL_State vmblState = {}; - VMBL_LoadExecutable(&vmblState, program, sizeof(program)); - VMBL_StartVM(&vmblState); + //VMBL_LoadExecutable(&vmblState, program, sizeof(program)); + //VMBL_StartVM(&vmblState); + + Tokenizer tokenizer = { + "push 1224\npush 2\ndiv\nhalt" + }; + Token token = getCurrentToken(&tokenizer); + + printf("%s\n", tokenTypeAsCStr(token.type)); return 0; } \ No newline at end of file diff --git a/src/vmbl.c b/src/vmbl.c index d6753a5..529b319 100644 --- a/src/vmbl.c +++ b/src/vmbl.c @@ -11,7 +11,6 @@ } \ (vmblState)->stack[(vmblState)->stackSize - 2] = (vmblState)->stack[(vmblState)->stackSize - 2] operation (vmblState)->stack[(vmblState)->stackSize - 1]; \ (vmblState)->stackSize--; \ - (vmblState)->ip++; \ } while (0); @@ -37,7 +36,7 @@ VMBL_Exception VBML_ExecuteInstruction(VMBL_State *vmblState, VMBL_Instruction i MATH_OP(vmblState, *); break; case INSTRUCTION_DIV: - if (instruction.opperands[0] == 0) { + if (vmblState->stack[vmblState->stackSize-1] == 0) { return (VMBL_Exception){ EXCEPTION_DIVIDE_BY_ZERO }; } @@ -152,7 +151,7 @@ void VMBL_LoadExecutable(VMBL_State *vmblState, VMBL_Instruction *program, size_ exit(1); } - memcpy(&vmblState->program, program, sizeof(program) * programSize); + memcpy(&vmblState->program, program, programSize); vmblState->programSize = programSize; } @@ -192,6 +191,7 @@ void VMBL_SaveExecutable(const char* filePath, VMBL_Instruction *program, size_t } char *instructionTypeToCStr(InstructionType type) { + printf("%x\n", type); switch (type) { @@ -227,6 +227,21 @@ char *instructionTypeToCStr(InstructionType type) { case INSTRUCTION_EQUAL: return "EQ "; break; + case INSTRUCTION_NOT_EQUAL: + return "NEQ "; + break; + case INSTRUCTION_GREATER_THAN: + return "GT "; + break; + case INSTRUCTION_GREATER_THAN_EQUAL: + return "GTE "; + break; + case INSTRUCTION_LESS_THAN: + return "LT "; + break; + case INSTRUCTION_LESS_THAN_EQUAL: + return "LTE "; + break; case INSTRUCTION_JUMP_CONDITIONAL: return "JC "; diff --git a/vmbl b/vmbl new file mode 100644 index 0000000..b4a7aff Binary files /dev/null and b/vmbl differ