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

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 "asm/tokenize.h"
#include <stdio.h>
#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;
}

View File

@@ -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 ";