From 2a232f8f42c0a7d5a7b648358a192c21865a55f6 Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Sat, 10 Jun 2023 23:45:25 -0700 Subject: lexing works --- lexer.c | 153 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 lexer.c (limited to 'lexer.c') diff --git a/lexer.c b/lexer.c new file mode 100644 index 0000000..bff9a40 --- /dev/null +++ b/lexer.c @@ -0,0 +1,153 @@ +#include +#include +#include +#include "lexer.h" + +token_t init_token(tokenType_t type, void* value) { + token_t t; + t.type = type; + t.value = value; + return t; +} +linkList_t* init_linklist(void* value, linkList_t* next) { + linkList_t* ll = calloc(sizeof(linkList_t), 1); + ll->value = value; + ll->next = next; + return ll; +} +int advance_whitespace(char** linePointer) { + int64_t a = (int64_t)linePointer; + while (**linePointer == ' ' || **linePointer == ' ') { + (*linePointer)++; + } + return (int)((int64_t)linePointer - a); +} +linkList_t* lex_line(char* line) { + char** p = malloc(sizeof(char*)); + *p = line; + linkList_t* root = init_linklist(NULL, NULL); + linkList_t* ll = root; + while (1) { + token_t t = lex_first_token(p); + if (t.type == EOL) { + printf("eol\n"); + break; + } + if (t.type == ERR) { + exit(1); + } + if (ll->value != NULL) { + ll->next = init_linklist(NULL, NULL); + ll = ll->next; + } + token_t* tp = malloc(sizeof(token_t)); + printf("good\n"); + *tp = t; + ll->value = tp; + } + free(p); + return root; +} +token_t lex_first_token(char** content) { + int m = 5; + char* s = malloc(sizeof(char) * m); + int c = 0; + advance_whitespace(content); + while (**content != '\n') { + s[c] = **content; + s[c+1] = '\0'; + (*content)++; + printf("lexing: %c\n", s[c]); + /* check if we need to parse a string or an int */ + if (s[c] >= 65 && s[c] <= 90) { + free(s); + (*content)--; + return lex_first_string(content); + } + else if (s[c] >= 48 && s[c] <= 57) { + free(s); + (*content)--; + return lex_first_int(content); + } + /* otherwise, check to see if a symbol has been matched */ + if (strcmp(s, "(") == 0) { + free(s); + return init_token(OPEN_PAREN, NULL); + } + else if (strcmp(s, ")") == 0) { + free(s); + return init_token(CLOSE_PAREN, NULL); + } + else if (strcmp(s, "#") == 0) { + free(s); + return init_token(START_COMMENT, NULL); + } + else if (strcmp(s, "|") == 0) { + free(s); + return init_token(JUSTIFICATION, NULL); + } + else if (strcmp(s, "pr") == 0) { + free(s); + return init_token(PREMISE, NULL); + } + else if (strcmp(s, "as") == 0) { + free(s); + return init_token(ASSUMPTION, NULL); + } + else if (strcmp(s, "^") == 0) { + free(s); + return init_token(CONJUNCTION, NULL); + } + else if (strcmp(s, "v") == 0) { + free(s); + return init_token(DISJUNCTION, NULL); + } + else if (strcmp(s, "->") == 0) { + free(s); + return init_token(IMPLICATION, NULL); + } + else if (strcmp(s, "<-") == 0) { + free(s); + return init_token(BI_IMPLICATION, NULL); + } + else if (c <= m) { + printf("c: %d\n", c); + c++; + continue; + } + else { + free(s); + return init_token(ERR, NULL); + } + } + return init_token(EOL, NULL); +} +token_t lex_first_string(char** content) { + int m = 50; + char* s = malloc(sizeof(char) * m); + int c = 0; + advance_whitespace(content); + while (**content >= 65 && **content <= 90) { + s[c] = **content; + (*content)++; + c++; + } + s[c] = '\0'; + return init_token(STRING, s); +} +token_t lex_first_int(char** content) { + int m = 10; + char* s = malloc(sizeof(char) * m); + int c = 0; + advance_whitespace(content); + while (**content >= 48 && **content <= 57) { + s[c] = **content; + (*content)++; + c++; + } + s[c] = '\0'; + int* ip = malloc(sizeof(int)); + *ip = atoi(s); + free(s); + return init_token(INT, (void*)ip); +} -- cgit v1.3.1