starting work on tokenizer for assembly language

This commit is contained in:
SpookyDervish
2025-12-21 05:47:15 +11:00
parent 03ea7bd418
commit b1ff26bcbb
6 changed files with 123 additions and 10 deletions

View File

@@ -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. 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 ## Syntax
### Example "Hello, World!" Program ### Example "Hello, World!" Program

56
src/asm/tokenize.c Normal file
View File

@@ -0,0 +1,56 @@
#include "tokenize.h"
#include <stdio.h>
#include <ctype.h>
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;
}
}

33
src/asm/tokenize.h Normal file
View File

@@ -0,0 +1,33 @@
#ifndef TOKENIZE_H
#define TOKENIZE_H
#include <stdbool.h>
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

View File

@@ -1,19 +1,28 @@
#include "vmbl.h" #include "vmbl.h"
#include "asm/tokenize.h"
#include <stdio.h>
#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])); #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]));
VMBL_Instruction program[] = { VMBL_Instruction program[] = {
MAKE_INST_PUSH(123), MAKE_INST_PUSH(124),
MAKE_INST_PUSH(0), MAKE_INST_PUSH(2),
MAKE_INST_DIV, MAKE_INST_DIV,
MAKE_INST_HALT
}; };
int main() { int main() {
VMBL_State vmblState = {}; //VMBL_State vmblState = {};
VMBL_LoadExecutable(&vmblState, program, sizeof(program)); //VMBL_LoadExecutable(&vmblState, program, sizeof(program));
VMBL_StartVM(&vmblState); //VMBL_StartVM(&vmblState);
Tokenizer tokenizer = {
"push 1224\npush 2\ndiv\nhalt"
};
Token token = getCurrentToken(&tokenizer);
printf("%s\n", tokenTypeAsCStr(token.type));
return 0; return 0;
} }

View File

@@ -11,7 +11,6 @@
} \ } \
(vmblState)->stack[(vmblState)->stackSize - 2] = (vmblState)->stack[(vmblState)->stackSize - 2] operation (vmblState)->stack[(vmblState)->stackSize - 1]; \ (vmblState)->stack[(vmblState)->stackSize - 2] = (vmblState)->stack[(vmblState)->stackSize - 2] operation (vmblState)->stack[(vmblState)->stackSize - 1]; \
(vmblState)->stackSize--; \ (vmblState)->stackSize--; \
(vmblState)->ip++; \
} while (0); } while (0);
@@ -37,7 +36,7 @@ VMBL_Exception VBML_ExecuteInstruction(VMBL_State *vmblState, VMBL_Instruction i
MATH_OP(vmblState, *); MATH_OP(vmblState, *);
break; break;
case INSTRUCTION_DIV: case INSTRUCTION_DIV:
if (instruction.opperands[0] == 0) { if (vmblState->stack[vmblState->stackSize-1] == 0) {
return (VMBL_Exception){ EXCEPTION_DIVIDE_BY_ZERO }; return (VMBL_Exception){ EXCEPTION_DIVIDE_BY_ZERO };
} }
@@ -152,7 +151,7 @@ void VMBL_LoadExecutable(VMBL_State *vmblState, VMBL_Instruction *program, size_
exit(1); exit(1);
} }
memcpy(&vmblState->program, program, sizeof(program) * programSize); memcpy(&vmblState->program, program, programSize);
vmblState->programSize = programSize; vmblState->programSize = programSize;
} }
@@ -192,6 +191,7 @@ void VMBL_SaveExecutable(const char* filePath, VMBL_Instruction *program, size_t
} }
char *instructionTypeToCStr(InstructionType type) { char *instructionTypeToCStr(InstructionType type) {
printf("%x\n", type);
switch (type) switch (type)
{ {
@@ -227,6 +227,21 @@ char *instructionTypeToCStr(InstructionType type) {
case INSTRUCTION_EQUAL: case INSTRUCTION_EQUAL:
return "EQ "; return "EQ ";
break; 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: case INSTRUCTION_JUMP_CONDITIONAL:
return "JC "; return "JC ";

BIN
vmbl Normal file

Binary file not shown.