sic

The sic programming language, compiler and tools (WIP)
Log | Files | Refs

commit 41c64bbaebc015b042cd43f14bf2407e17fe48a9
parent 18d88480bc4da10e9c224d951f7d7510bb542d1a
Author: citbl <citbl@citbl.org>
Date:   Sun, 10 May 2026 16:58:08 +1000

reformat

Diffstat:
M.clang-format | 4++--
Msrc/common.h | 136++++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/lexer.c | 172+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/main.c | 28++++++++++++++--------------
Msrc/utils.c | 68++++++++++++++++++++++++++++++++++----------------------------------
5 files changed, 203 insertions(+), 205 deletions(-)

diff --git a/.clang-format b/.clang-format @@ -1,6 +1,6 @@ BasedOnStyle: Webkit -IndentWidth: 8 -ContinuationIndentWidth: 8 +IndentWidth: 4 +ContinuationIndentWidth: 4 UseTab: AlignWithSpaces PointerAlignment: Right diff --git a/src/common.h b/src/common.h @@ -6,91 +6,91 @@ #include <stddef.h> typedef enum Token_Type { - NOTYETSET = 9, - IDENT, - KEYWORD, - SYMBOL, - PLUS, - MIN, - STAR, - SLASH, - BACKSLASH, - PERCENT, - LBRACE, - RBRACE, - LPAREN, - RPAREN, - EQ_EQ, - BANG_EQ, - EQ_GT, - LT_EQ, - LT_DASH, - DASH_GT, - EQ, - BANG, - LIT_STRING, - LIT_DECIMAL, - LIT_INT, - LIT_BOOL, - LIT_VOID, + NOTYETSET = 9, + IDENT, + KEYWORD, + SYMBOL, + PLUS, + MIN, + STAR, + SLASH, + BACKSLASH, + PERCENT, + LBRACE, + RBRACE, + LPAREN, + RPAREN, + EQ_EQ, + BANG_EQ, + EQ_GT, + LT_EQ, + LT_DASH, + DASH_GT, + EQ, + BANG, + LIT_STRING, + LIT_DECIMAL, + LIT_INT, + LIT_BOOL, + LIT_VOID, } Token_Type; typedef enum Keyword { - IF = 139, - ELSE, - WHILE, - OPT, - LAZY, - MATCH, - DEF, - FOR, - EACH, - SOME, - NONE, - OK, - ERR, - IN, - IS, - CAST + IF = 139, + ELSE, + WHILE, + OPT, + LAZY, + MATCH, + DEF, + FOR, + EACH, + SOME, + NONE, + OK, + ERR, + IN, + IS, + CAST } Keyword; ///////////////////////////////////////////////// typedef struct String { - char *value; - size_t cap; - size_t len; + char *value; + size_t cap; + size_t len; } String; typedef struct Token { - Token_Type type; - union Value { - String as_string; - char as_char; - size_t as_int; - bool as_bool; - } value; - const char *path; - const char *filename; - size_t line; - size_t col; + Token_Type type; + union Value { + String as_string; + char as_char; + size_t as_int; + bool as_bool; + } value; + const char *path; + const char *filename; + size_t line; + size_t col; } Token; typedef struct Lexer_State { - size_t pos; - bool in_string; - bool in_comment; + size_t pos; + bool in_string; + bool in_comment; } Lexer_State; typedef struct Lexer { - const char *code; - size_t code_len; - const char *path; - const char *filename; - Lexer_State state; - Token *tokens; - size_t len; - size_t cap; + const char *code; + size_t code_len; + const char *path; + const char *filename; + Lexer_State state; + Token *tokens; + size_t len; + size_t cap; } Lexer; ///////////////////////////////////////////////// diff --git a/src/lexer.c b/src/lexer.c @@ -4,123 +4,121 @@ static void add_token(Lexer *l, Token t) { - if (l->len >= l->cap) { - l->cap = l->cap == 0 ? 256 : l->cap * 2; - l->tokens = realloc(l->tokens, l->cap * sizeof(Token)); - } + if (l->len >= l->cap) { + l->cap = l->cap == 0 ? 256 : l->cap * 2; + l->tokens = realloc(l->tokens, l->cap * sizeof(Token)); + } - l->tokens[l->len++] = t; + l->tokens[l->len++] = t; } void print_tokens(Lexer *l) { - Token t; - Token_Type typ; - size_t i; - - for (i = 0; i < l->len; i++) { - t = l->tokens[i]; - typ = t.type; - switch (typ) { - case LIT_STRING: - printf("STRING LITERAL: %s\n", l->tokens[i].value.as_string.value); - break; - default: - printf("print_tokens: unhandled token %i", typ); - break; - } + Token t; + Token_Type typ; + size_t i; + + for (i = 0; i < l->len; i++) { + t = l->tokens[i]; + typ = t.type; + switch (typ) { + case LIT_STRING: + printf("STRING LITERAL: %s\n", l->tokens[i].value.as_string.value); + break; + default: + printf("print_tokens: unhandled token %i", typ); + break; } + } } static void add_to_string(Token *t, char c) { - String *str = &t->value.as_string; - char *new_value; + String *str = &t->value.as_string; + char *new_value; - if (str->len >= str->cap) { - str->cap = str->cap == 0 ? 256 : str->cap * 2; - str->value = realloc(str->value, str->cap * sizeof(char)); - } + if (str->len >= str->cap) { + str->cap = str->cap == 0 ? 256 : str->cap * 2; + str->value = realloc(str->value, str->cap * sizeof(char)); + } - str->value[str->len++] = c; - str->value[str->len] = '\0'; + str->value[str->len++] = c; + str->value[str->len] = '\0'; } static char peek(Lexer *l) { - size_t next = l->state.pos + 1; + size_t next = l->state.pos + 1; - if (next >= l->code_len) { - return '\0'; - } + if (next >= l->code_len) { + return '\0'; + } - return l->code[next]; + return l->code[next]; } static char consume(Lexer *l) { - return l->code[++l->state.pos]; + return l->code[++l->state.pos]; } static void run_until_char(Lexer *l, char c) { - do { - // printf("%zu", l->state.pos); - l->state.pos++; - } while (peek(l) != c); + do { + // printf("%zu", l->state.pos); + l->state.pos++; + } while (peek(l) != c); } Lexer *lexer_lex(Lexer *l) { - char c = '\0'; - size_t len = strlen(l->code); - Token t = { - .filename = l->filename, .path = l->path, .col = -1, .line = -1, .type = NOTYETSET, .value = { 0 } - }; - - l->tokens = calloc(250, sizeof(Token)); - l->state.pos = 0; - l->state.in_string = false; - - // longest valid token first - while (l->state.pos <= len) { - c = l->code[l->state.pos]; - - if (c == '/' && peek(l) == '/') { - // continue until the end of the line - run_until_char(l, '\n'); - l->state.pos++; - continue; - } - - switch (c) { - case '\"': - l->state.in_string = true; - t.type = LIT_STRING; - c = l->code[++l->state.pos]; - - while (l->code[l->state.pos] != '\"') { - add_to_string(&t, c); - c = l->code[++l->state.pos]; - } - - l->state.pos++; - l->state.in_string = false; - add_token(l, t); - continue; - case EOF: - return l; - case '\n': - case '\r': - l->state.pos++; - continue; - break; - } - - // printf("%zu", l->state.pos); - printf("unhandled: %c\n", c); - l->state.pos++; + char c = '\0'; + size_t len = strlen(l->code); + Token t = { .filename = l->filename, .path = l->path, .col = -1, .line = -1, .type = NOTYETSET, .value = { 0 } }; + + l->tokens = calloc(250, sizeof(Token)); + l->state.pos = 0; + l->state.in_string = false; + + // longest valid token first + while (l->state.pos <= len) { + c = l->code[l->state.pos]; + + if (c == '/' && peek(l) == '/') { + // continue until the end of the line + run_until_char(l, '\n'); + l->state.pos++; + continue; } - return l; + switch (c) { + case '\"': + l->state.in_string = true; + t.type = LIT_STRING; + c = l->code[++l->state.pos]; + + while (l->code[l->state.pos] != '\"') { + add_to_string(&t, c); + c = l->code[++l->state.pos]; + } + + l->state.pos++; + l->state.in_string = false; + add_token(l, t); + continue; + case EOF: + return l; + case '\n': + case '\r': + l->state.pos++; + continue; + break; + } + + // printf("%zu", l->state.pos); + printf("unhandled: %c\n", c); + l->state.pos++; + } + + return l; } diff --git a/src/main.c b/src/main.c @@ -6,24 +6,24 @@ int main(int argc, char **args) { - char *filename; - char *contents; - Lexer lexer = { 0 }; + char *filename; + char *contents; + Lexer lexer = { 0 }; - if (argc < 1) return 1; + if (argc < 1) return 1; - filename = args[1]; - if (filename == NULL) return 1; + filename = args[1]; + if (filename == NULL) return 1; - contents = read_file(filename); - if (contents == NULL) return 1; - lexer.code = contents; - lexer.code_len = strlen(contents); + contents = read_file(filename); + if (contents == NULL) return 1; + lexer.code = contents; + lexer.code_len = strlen(contents); - lexer = *lexer_lex(&lexer); + lexer = *lexer_lex(&lexer); - print_tokens(&lexer); + print_tokens(&lexer); - printf("\n"); - return 0; + printf("\n"); + return 0; } diff --git a/src/utils.c b/src/utils.c @@ -6,46 +6,46 @@ char *read_file(const char *filename) { - long fsize; - char *source; - FILE *fp = fopen(filename, "r"); - if (fp == NULL) { - fprintf(stderr, "file not found\n"); - return NULL; - } - - fseek(fp, 0, SEEK_END); - fsize = ftell(fp); - fseek(fp, 0, SEEK_SET); - - source = malloc(fsize + 1); - fread(source, fsize, 1, fp); - fclose(fp); - - source[fsize] = '\0'; - return source; + long fsize; + char *source; + FILE *fp = fopen(filename, "r"); + if (fp == NULL) { + fprintf(stderr, "file not found\n"); + return NULL; + } + + fseek(fp, 0, SEEK_END); + fsize = ftell(fp); + fseek(fp, 0, SEEK_SET); + + source = malloc(fsize + 1); + fread(source, fsize, 1, fp); + fclose(fp); + + source[fsize] = '\0'; + return source; } void separate_file_from_path(const char *fullpath, char **out_path, char **out_filename) { - char *path = strdup(fullpath); - char *filename = strrchr(path, '/'); - - if (filename == NULL) { - printf("No path found\n"); - exit(1); - } - - *filename = '\0'; - filename++; - *out_path = strdup(path); - *out_filename = strdup(filename); - free(path); + char *path = strdup(fullpath); + char *filename = strrchr(path, '/'); + + if (filename == NULL) { + printf("No path found\n"); + exit(1); + } + + *filename = '\0'; + filename++; + *out_path = strdup(path); + *out_filename = strdup(filename); + free(path); } void die(bool condition, const char *message) { - if (!condition) return; - fprintf(stderr, "%s", message); - exit(1); + if (!condition) return; + fprintf(stderr, "%s", message); + exit(1); }