#include "slice.h" #include "drain.h" #include "lexer.h" #include "token.h" #include "group.h" #include "identify.h" #include "check.h" #include "scope.h" #include "memory.h" #include #include static void destroy_duplicates(Token **list, unsigned int type) { for (Token *e = (*list)->next; e != NULL; e = e->next) if (e->type == type && e->prev->type == type) token_delete(list, e->prev); } int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "usage: %s \n", argv[0]); return 1; } FILE *file = fopen(argv[1], "rb"); if (file == NULL) { perror("main:fopen"); return 1; } Slice slice = slice_from_str(drain(file)); fclose(file); Token *tokens = lexer(slice); if (tokens != NULL) { Memory memory = {0}; destroy_duplicates(&tokens, TOK_END); do { if (group_scope(&tokens) || group_atom(&tokens) || group_funcall(&tokens) || group_deref(&tokens)) { fprintf(stderr, "a group operation failed\n"); break; } identify(tokens, identify_function, GROUP_FUNCTION); identify(tokens, identify_let, GROUP_LET); identify(tokens, identify_return, GROUP_RETURN); identify(tokens, identify_assign, GROUP_ASSIGN); identify(tokens, identify_if, GROUP_IF); identify(tokens, identify_else, GROUP_ELSE); identify(tokens, identify_while, GROUP_WHILE); identify(tokens, identify_expression, GROUP_EXPRESSION); if (check_atom(tokens)) { fprintf(stderr, "unidentified atoms remain\n"); break; } Token *group = group_create(&tokens, tokens, token_last(tokens)); if (group == NULL) { fprintf(stderr, "group_create failed\n"); break; } group->group.type = GROUP_SCOPE; scope_extract(tokens); scope_function(tokens); if (memory_create(&memory, tokens)) { fprintf(stderr, "memory_create failed\n"); break; } token_print(tokens, 1, 0); } while(0); memory_destroy(&memory); token_destroy(tokens); } if (slice.str != NULL) free(slice.str); return 0; }