diff --git a/src/grammar.y b/src/grammar.y index d275f94..921a666 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -4,6 +4,7 @@ extern int yylex(void); void yyerror(const char *err); extern char* yytext; + extern int yyleng; extern int yychar; extern SymbolTable * cur; //char* cur_value; @@ -122,8 +123,8 @@ idlist: ; sblock: - L_BRACE {cur = CreateScope(cur,2,2);} statement_list {cur = getParent(cur);} R_BRACE - | L_BRACE {cur = CreateScope(cur,2,2);} dblock statement_list {cur = getParent(cur);} R_BRACE + L_BRACE {column_number += yyleng; cur = CreateScope(cur,line_number,column_number);} statement_list {cur = getParent(cur);} R_BRACE + | L_BRACE {column_number += yyleng; cur = CreateScope(cur,line_number,column_number);} dblock statement_list {cur = getParent(cur);} R_BRACE ; dblock: diff --git a/src/lexicalStructure.lex b/src/lexicalStructure.lex index c2db6b5..98a70d2 100644 --- a/src/lexicalStructure.lex +++ b/src/lexicalStructure.lex @@ -7,9 +7,11 @@ %{ #include #include "../tmp/grammar.tab.h" + #include "../src/symbol_table.h" #ifndef DEBUG #define DEBUG 0 #endif + extern SymbolTable * cur; int line_number = 1, column_number = 1; %} diff --git a/src/runner.c b/src/runner.c index fa361d5..2132f65 100644 --- a/src/runner.c +++ b/src/runner.c @@ -4,187 +4,187 @@ #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; + if (argc == 1) { + fprintf(stderr, INVALID); + return -1; } - } - alpha_file = fopen(argv[argc - 1], "r"); - } - } - return run(alpha_file); + + 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; - } + 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; + } } int run(FILE *alpha) { - int token; - cur = CreateScope(NULL, 1, 1); + 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++; + // If file is not found + if (alpha == NULL) { + fprintf(stderr, "INPUT FILE NOT FOUND\n"); + return -1; } - 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); + yyin = alpha; - if (yyin != NULL) { - fclose(yyin); - } - return 0; - } + // 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 (st_flag != NULL) { - // output symbol table, file pointer is - // print_symbol_table(top,st_flag); - } + if (yyin != NULL) { + fclose(yyin); + } + return 0; + } - yyparse(); - FILE *f = fdopen(1, "w"); - print_symbol_table(getAncestor(cur), f); - fclose(f); + if (st_flag != NULL) { + // output symbol table, file pointer is + // print_symbol_table(top,st_flag); + } - if (yyin != NULL) { - fclose(yyin); - } + yyparse(); + FILE *f = fdopen(1, "w"); + print_symbol_table(getAncestor(cur), f); + fclose(f); - return 0; + if (yyin != NULL) { + fclose(yyin); + } + + return 0; } bool is_help(char *input) { - if (strcmp(input, "-help") == 0) { - printf("%s", HELP); - return true; - } + if (strcmp(input, "-help") == 0) { + printf("%s", HELP); + return true; + } - return false; + return false; } int new_file(char *arg, char *alpha) { - int type_len; - const char *basename = alpha; - const char *slash = strchr(alpha, '/'); + int type_len; + const char *basename = alpha; + const char *slash = strchr(alpha, '/'); - while (slash != NULL) { - basename = slash + 1; - slash = strchr(basename, '/'); - } + while (slash != NULL) { + basename = slash + 1; + slash = strchr(basename, '/'); + } - mkdir("./out", 0777); + mkdir("./out", 0777); - char *new_basename = calloc(strlen(basename) + 5, sizeof(char)); - strcpy(new_basename, "./out/"); - strcat(new_basename, basename); - basename = new_basename; + 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; - } + 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)); + // 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); + // 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; + 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 + 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); + cur = CreateScope(cur, line, column); } void exit_scope() { - if (cur->Parent_Scope == NULL) { - printf("Can't close top"); - return; - } - cur = cur->Parent_Scope; + if (cur->Parent_Scope == NULL) { + printf("Can't close top"); + return; + } + cur = cur->Parent_Scope; } diff --git a/tests/sprint2/test/sp2_llnode.alpha b/tests/sprint2/test/sp2_llnode.alpha new file mode 100644 index 0000000..880ca0b --- /dev/null +++ b/tests/sprint2/test/sp2_llnode.alpha @@ -0,0 +1,74 @@ +type rec: [integer: x; integer: y] +type T1: integer -> integer +type T2: rec -> integer + +type llnode: [address: prev; integer: val; address: next] +type list: integer -> llnode + +function foo : T1 +function bar1 : T2 +function bar2 : T2 +function make_list : list +make_list(a) := { + [integer:orig_a; address: ret; address: curr; address: temp] + if (a < 0 | a = 0) then { + return null; + } else { + ret := reserve llnode; + ret.prev := null; + ret.next := null; + ret.val := a; + while (0 < a) { + temp := reserve llnode; + temp.prev := null; + temp.next := null; + temp.val := val; + if (a = orig_a) then { + ret.next := temp; + temp.prev := ret; + curr := temp; + } else { + curr.next := temp; + temp.prev := curr; + curr := temp; + } + a := a - 1; + } + return ret; + } +} + + +foo(x) := { + return x * x; + } +bar1(a) := { + return a.x * a.y; + } + +bar2 as (r,s) := { + if (r < s) then { + while (!(r < s)) { + r := r + 1; + } + } else { + [integer: x] + x := 0; + while (x < 10) { + r := r + s; + } + } + return r * s; + } +entry(arg) := { + [ integer: result ; rec: w; llnode: li] + li := make_list(6); + result := foo(5); + w := reserve w; + w.x := 5; + w.y := 7; + result := bar1(w); + result := bar2(5,7); + + return 0; +}