From f1fb8610cdcfe6df8685634d62a392a5dd14a80d Mon Sep 17 00:00:00 2001 From: shabani005 Date: Sun, 20 Jul 2025 22:24:25 +0300 Subject: [PATCH] filename update --- lexer.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.c | 5 ++- nob.c | 6 ++-- 3 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 lexer.c diff --git a/lexer.c b/lexer.c new file mode 100644 index 0000000..bcb9376 --- /dev/null +++ b/lexer.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include +#include + + +typedef struct{ + char* mstr; +} mstring; + +typedef struct{ + int mint; +} mint; + +typedef struct{ + float myfloat; +} mfloat; + + +typedef enum{ + TOKEN_PLUS, + TOKEN_MINUS, + TOKEN_INTEGER, + intdef, + TOKEN_UNKNOWN, +} symbols; + +typedef struct{ + symbols type; + char* text; + size_t text_len; +} Token; + +typedef struct{ + char *content; + // size_t cursor; + // size_t line; +} Lexer; + + +// Lexer +void lexer_new(char *content, size_t content_len){ + +} +// Token +void lexer_next(Lexer *mylexer){ +} + + +Token read_from_tok(char* text, uint cursor){ + Token mytoks; + static char buf[64]; + size_t i = 0; + if (isdigit(text[cursor])) { + // Start of an integer token + size_t start = cursor; + while (isdigit(text[cursor])) { + buf[i++] = text[cursor++]; + } + buf[i] = '\0'; + mytoks.type = TOKEN_INTEGER; + mytoks.text = buf; + mytoks.text_len = i; + }else { + buf[0] = text[cursor]; + buf[1] = '\0'; + mytoks.text = buf; + + switch (text[cursor]){ + case '+': + mytoks.type = TOKEN_PLUS; + // asigning text is not really needed unless for debug + mytoks.text = "+"; + break; + case '-': + mytoks.type = TOKEN_MINUS; + mytoks.text = "-"; + break; + default: + mytoks.type = TOKEN_UNKNOWN; + } + } + return mytoks; +} + + +// Token* c + + + +// operators accepted in int/digit or whatever type def only when they have a digit before AND after them + +int main(){ + Token newtok; + char* input = "32323 + 232"; + int length1 = strlen(input); + int i = 0; + while (i < length1) { + Token result = read_from_tok(input, i); + printf("text: %s\ntype: %u\n\n", result.text, result.type); + if (result.type == TOKEN_INTEGER) { + i += result.text_len; // to skip the whole integer + } else { + i++; + } +} +} diff --git a/main.c b/main.c index bcb9376..524022a 100644 --- a/main.c +++ b/main.c @@ -53,8 +53,7 @@ Token read_from_tok(char* text, uint cursor){ Token mytoks; static char buf[64]; size_t i = 0; - if (isdigit(text[cursor])) { - // Start of an integer token + if (isdigit(text[cursor])) { size_t start = cursor; while (isdigit(text[cursor])) { buf[i++] = text[cursor++]; @@ -86,7 +85,7 @@ Token read_from_tok(char* text, uint cursor){ } -// Token* c + diff --git a/nob.c b/nob.c index 3755fda..0d5ad46 100644 --- a/nob.c +++ b/nob.c @@ -5,8 +5,8 @@ int main(void){ nb_append(&cmd, "gcc"); nb_append(&cmd, "-Wall -Wextra"); - nb_append(&cmd, "main.c"); - nb_append(&cmd, "-o newl"); + nb_append(&cmd, "lexer.c"); + nb_append(&cmd, "-o lex"); nb_print_info(&cmd); @@ -14,7 +14,7 @@ int main(void){ nb_free(&cmd); - nb_append(&cmd, "./newl"); + nb_append(&cmd, "./lex"); nb_print_info(&cmd);