starting work on tokenizer for assembly language
This commit is contained in:
@@ -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
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 "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;
|
||||||
}
|
}
|
||||||
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)->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 ";
|
||||||
|
|||||||
Reference in New Issue
Block a user