/* Runner File - Compiles alpha Compiler */ /* The Translators - Spring 2025 */ #include "runner.h" int main(int argc, char *argv[]) { if (argc == 1) { fprintf(stderr, INVALID); return -1; } else if (argc == 2) { if (is_help(argv[1])) { return 0; } else if (is_alpha_file(argv[1], strlen(argv[1])) == 0) { no_flag = SET_FLAG; alpha_file = fopen(argv[1], "r"); } else { fprintf(stderr, INVALID); return -1; } } else { if (is_alpha_file(argv[argc - 1], strlen(argv[argc - 1])) != 0) { fprintf(stderr, INVALID); return -1; } else { for (int i = 1; i < argc - 1; i++) { if (check_flag(argv[i], argv[argc - 1]) != 0) { fprintf(stderr, "INVALID FLAG(S): Use -help to view valid inputs \n"); return -1; } } alpha_file = fopen(argv[argc - 1], "r"); } } return run(alpha_file); } int check_flag(char *arg, char *alpha) { if (strcmp("-tok", arg) == 0) { if (tok_flag == NULL) { return new_file(arg, alpha); } fprintf(stderr, "FLAGS REPEAT\n"); return -1; } else if (strcmp("-st", arg) == 0) { if (st_flag == NULL) { return new_file(arg, alpha); } fprintf(stderr, "FLAGS REPEAT\n"); return -1; } else { fprintf(stderr, "INVALID FLAG: Use -help for valid inputs\n"); return -1; } } void incr(int lnum,int cnum, int tok){ //if (tok == COMMENT) { for (int i = 0; i < yyleng; i++) { if (yytext[i] == '\n') { line_number++; column_number = 0; } column_number++; } // }else{ // column_number += yyleng; // } } void print_tok(int tok){ fprintf(tok_flag, "%d %d %3d \"%s\"\n", line_number, column_number,tok, yytext); } int run(FILE *alpha) { int token; cur = CreateScope(NULL, 1, 1); // If file is not found if (alpha == NULL) { fprintf(stderr, "INPUT FILE NOT FOUND\n"); return -1; } yyin = alpha; // TOK FLAG if (tok_flag != NULL) { while (0 != (token = yylex())) { //if (tok_flag != NULL) { // fprintf(tok_flag, "%d %d %3d \"%s\"\n", line_number, column_number, // token, yytext); //} /*if (token == COMMENT) { for (int i = 0; i < yyleng; i++) { if (yytext[i] == '\n') { line_number++; column_number = 0; } column_number++; } continue; } if (token == 1999) { printf( "On line number %d and column number %d we have an invalid " "character:%s\n", line_number, column_number, yytext); } column_number += yyleng; */ } fclose(tok_flag); if (yyin != NULL) { fclose(yyin); } return 0; } if (st_flag != NULL) { // output symbol table, file pointer is // print_symbol_table(top,st_flag); } yyparse(); FILE *f = fdopen(1, "w"); print_symbol_table(getAncestor(cur), f); fclose(f); if (yyin != NULL) { fclose(yyin); } return 0; } bool is_help(char *input) { if (strcmp(input, "-help") == 0) { printf("%s", HELP); return true; } return false; } int new_file(char *arg, char *alpha) { int type_len; const char *basename = alpha; const char *slash = strchr(alpha, '/'); while (slash != NULL) { basename = slash + 1; slash = strchr(basename, '/'); } mkdir("./out", 0777); char *new_basename = calloc(strlen(basename) + 5, sizeof(char)); strcpy(new_basename, "./out/"); strcat(new_basename, basename); basename = new_basename; if (strcmp(arg, "-tok") == 0) { type_len = TOK_LEN; } else if (strcmp(arg, "-st") == 0) { type_len = ST_LEN; } else { fprintf(stderr, "INVALID FLAG: Use -help to view valid inputs\n"); return -1; } // calculate lengths int basename_len = strlen(basename); char *file_name = calloc(basename_len - ALPHA_OFFSET + type_len + 2, sizeof(char)); // coy filename and add extension strncpy(file_name, basename, basename_len - ALPHA_OFFSET); strcat(file_name, "."); strcat(file_name, arg + 1); if (strcmp(arg, "-tok") == 0) { tok_flag = fopen(file_name, "w"); } else if (strcmp(arg, "-st") == 0) { st_flag = fopen(file_name, "w"); } return 0; } int is_alpha_file(char *alpha, int file_len) { if (strcmp(".alpha", alpha + sizeof(char) * (file_len - ALPHA_OFFSET)) != 0) { return -1; // not alpha file } return 0; // is alpha file } void enter_scope(int line, int column) { cur = CreateScope(cur, line, column); } void exit_scope() { if (cur->Parent_Scope == NULL) { printf("Can't close top"); return; } cur = cur->Parent_Scope; }