starting work on tokenizer for assembly language
This commit is contained in:
56
src/asm/tokenize.c
Normal file
56
src/asm/tokenize.c
Normal 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
33
src/asm/tokenize.h
Normal 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
|
||||
21
src/main.c
21
src/main.c
@@ -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;
|
||||
}
|
||||
21
src/vmbl.c
21
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 ";
|
||||
|
||||
Reference in New Issue
Block a user