#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 #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) { destroy_duplicates(&tokens, TOK_END); group_scope(&tokens); group_atom(&tokens); group_funcall(&tokens); group_deref(&tokens); identify(tokens, identify_function, GROUP_FUNCTION, 0); identify(tokens, identify_let, GROUP_LET, 1); identify(tokens, identify_return, GROUP_RETURN, 1); identify(tokens, identify_assign, GROUP_ASSIGN, 1); identify(tokens, identify_if, GROUP_IF, 1); identify(tokens, identify_else, GROUP_ELSE, 1); identify(tokens, identify_while, GROUP_WHILE, 1); identify(tokens, identify_expression, GROUP_EXPRESSION, 1); do { if (check_atom(tokens)) { fprintf(stderr, "unidentified atoms are left\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); token_print(tokens, 1, 0); } while(0); token_destroy(tokens); } if (slice.str != NULL) free(slice.str); return 0; }