#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); }