88 lines
2.5 KiB
C
88 lines
2.5 KiB
C
// Kyler Olsen
|
|
// ZINC Bootstrap compiler
|
|
// Main
|
|
// June 2025
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "sync/types.h"
|
|
#include "sync/lexer.h"
|
|
#include "sync/syntax.h"
|
|
|
|
const char* TOKEN_TYPES[] = {
|
|
"EOF", "IDENTIFIER", "NUMBER", "OPERATOR",
|
|
"LPAREN", "RPAREN", "SEMICOLON", "LBRACE",
|
|
"RBRACE", "LBRACKET", "RBRACKET", "CHARACTER",
|
|
"STRING", "KEYWORD"
|
|
};
|
|
|
|
static void print_token(Token token) {
|
|
printf("Token: %-15s | Text: %.*s\n",
|
|
TOKEN_TYPES[token.type],
|
|
(int)token.length, token.start
|
|
);
|
|
}
|
|
|
|
int main(void) {
|
|
const char* filename = "test/example1.zn";
|
|
FILE* file = fopen(filename, "rb");
|
|
if (!file) {
|
|
fprintf(stderr, "Failed to open file: %s\n", filename);
|
|
return 1;
|
|
}
|
|
fseek(file, 0, SEEK_END);
|
|
long filesize = ftell(file);
|
|
fseek(file, 0, SEEK_SET);
|
|
char *source = malloc(filesize + 1);
|
|
if (!source) {
|
|
fprintf(stderr, "Failed to allocate memory.\n");
|
|
fclose(file);
|
|
return 1;
|
|
}
|
|
fread(source, 1, filesize, file);
|
|
source[filesize] = '\0';
|
|
fclose(file);
|
|
|
|
Lexer lexer;
|
|
lexer_init(&lexer, filename, source);
|
|
|
|
LexerResult lexer_result = lexical_analysis(&lexer);
|
|
if (lexer_result.type == SYNC_ERROR) {
|
|
fprintf(stderr, "Error: %s\n", lexer_result.error.message);
|
|
free(source);
|
|
return lexer_result.error.code;
|
|
}
|
|
|
|
TokenResult* token_result = lexer_result.result;
|
|
int error_count = 0;
|
|
while (token_result != NULL) {
|
|
if (token_result->type == SYNC_ERROR) {
|
|
fprintf(stderr, "Error: %s\n", token_result->error.message);
|
|
fprintf(stderr, "\tFilename: %s\n", token_result->error.file_info.filename);
|
|
fprintf(stderr, "\tLn: %zi, Col: %zi\n", token_result->error.file_info.line, token_result->error.file_info.column);
|
|
clean_token_result(lexer_result.result);
|
|
free(source);
|
|
return 1;
|
|
} else {
|
|
print_token(token_result->result);
|
|
}
|
|
token_result = token_result->next;
|
|
}
|
|
|
|
TokenArrayResult array_result = token_result_array(lexer_result.result);
|
|
clean_token_result(lexer_result.result);
|
|
if (array_result.type == SYNC_ERROR) {
|
|
fprintf(stderr, "Error: %s\n", array_result.error.message);
|
|
free(source);
|
|
return array_result.error.code;
|
|
}
|
|
TokenArray tokens = array_result.result;
|
|
|
|
free(tokens.tokens);
|
|
free(source);
|
|
|
|
printf("Compilation Completed.");
|
|
|
|
return 0;
|
|
}
|