diff --git a/Makefile b/Makefile index 4b92e65..0f7f411 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,7 @@ debug: clean compiler test: chmod +x ./check.sh chmod +x ./test.sh - $(foreach test, $(TESTS-S1), (./$(EXE) -tok $(test) -debug || true);) + $(foreach test, $(TESTS-S1), (./$(EXE) -tok -debug $(test) || true);) ./test.sh sp2 ./test.sh sp3 ./test.sh sp4 @@ -46,7 +46,7 @@ test: test-s1: chmod +x ./check.sh chmod +x ./test.sh - $(foreach test, $(TESTS-S1), (./$(EXE) -tok $(test) -debug || true);) + $(foreach test, $(TESTS-S1), (./$(EXE) -tok -debug $(test) || true);) ./check.sh sp1 test-s2: diff --git a/src/grammar.y b/src/grammar.y index 1725d62..7dd6499 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -11,35 +11,16 @@ // 4️⃣ Rule end-markers (;, |) should always be 4 spaces in. // 5️⃣ C-blocks should always be clearly defined and follow clang formatting rules. // 6️⃣ 1-line if/for/while statements must be wrapped in curly braces. -// 7️⃣ DO NOT USE TABS. EVER. +// 7️⃣ Comments should always be above rules +// 8️⃣ DO NOT USE TABS. EVER. // Please ask Scarlett if you are unsure of how to format something. Thanks! 😀 %{ - #include #include "../src/symbol_table.c" - #include - extern int yylex(void); + void yyerror(const char *err); - extern char* yytext; - extern int yyleng; - extern int yychar; - extern SymbolTable * cur; - //char* cur_value; - //char* cur_type; int token_tracker; - extern int line_number; - extern int column_number; - extern FILE * yyin; - extern TableNode* funprime; - extern TableNode* arrayprim; - extern TableNode* recprime; - extern TableNode* funtypeprime; - extern TableNode* integ; - extern TableNode* addr; - extern TableNode* chara; - extern TableNode* stri; - extern TableNode* boo; TableNode * tn; %} @@ -144,6 +125,7 @@ prototype: definition: TYPE ID COLON { + printdebug("Currently see a record definition for %s", $2); tn = CreateEntry(getAncestor(cur),TYPE_RECORD_TYPE, recprime, $2, CreateRecordInfo(0, cur = CreateScope(cur, 0, 0))); if (look_up(cur, $2) == undefined) { @@ -210,6 +192,7 @@ definition: | ID { TableNode *node = table_lookup(getAncestor(cur), $1); if (node == undefined) { + printdebug(" undefined nodedeclared at line %d, column %d", @1.first_line, @1.first_column); }else if(getAdInfoType(node) != TYPE_FUNCTION_DECLARATION){ printdebug("not a valid function declaration at line %d, column %d", @1.first_line, @1.first_column); @@ -228,6 +211,7 @@ definition: }else if(getAdInfoType(parameter) != TYPE_RECORD){ printdebug("record: %s., primitive: %s.", getType(parameter), getName(recprime)); printdebug("function defined with as, but parameter is type %s at line %d, column %d", getType(parameter),@1.first_line, @1.first_column); + }else { for (TableNode* entry = getFirstEntry(getRecList(parameter)); entry!= NULL; entry = getNextEntry(entry)){ int type_of_param_type = getAdInfoType(entry); @@ -341,6 +325,7 @@ sblock: dblock: + L_BRACKET {if(getLine(cur)==0){ setLineNumber(cur, @1.first_line); @@ -349,6 +334,7 @@ dblock: cur = CreateScope(cur,@1.first_line,@1.first_column); } } + declaration_list R_BRACKET; diff --git a/src/intermediate_code.c b/src/intermediate_code.c new file mode 100644 index 0000000..2d50a34 --- /dev/null +++ b/src/intermediate_code.c @@ -0,0 +1,64 @@ + + + +// TODO: this is here to bring your attention to the comment bellow. +// check if start is NULL if it is assign it to the start globle variable +// otherwise make it next of current and set cur to your instruction. + + + + void emit_binary_op(char* result, char* op, char* arg1, char* arg2){ + return; + } + void emit_unary_op(char* result, char* op, char* arg){ + return; + } + void emit_assignment(char* target, char* source){ + return; + } +void emit_as_file(FILE * out_file, Instruction * instr_arr){ + return; +} + + +void emit_label(char* label){ + return; +} +void emit_jump(char* label){ + return; +} +void emit_conditional_jump(char* condition, char* label){ + return; +} + + + +void emit_function_start(char* name){ + return; +} +void emit_parameter(char* param){ + return; +} +void emit_function_call(char* result, char* name){ + return; +} +void emit_return(char* value){ + return; +} +void emit_reserve(char* result, char* type_name, int size){ + return; +} +void emit_release(char* pointer){ + return; +} + + +void emit_field_access(char* result, char* record, char* field){ + return; +} +void emit_array_access(char* result, char* array, char* index, char* dimension){ + return; +} +void emit_bounds_check(char* index, char* size, char* error_label){ + return; +} diff --git a/src/intermediate_code.h b/src/intermediate_code.h new file mode 100644 index 0000000..1ccd389 --- /dev/null +++ b/src/intermediate_code.h @@ -0,0 +1,59 @@ +// Track 1: Core Infrastructure & Basic Expressions +// * Create intermediate_code.h/.c defining the instruction structure: +// - Struct with fields for: opcode, result, operand1, operand2, label +// - Enum for all operation types (ADD, SUB, MUL, DIV, etc.) +// * Implement temp variable generator function that produces unique names (t1, t2, etc.) +// * Create specific code emission functions: +// - emit_binary_op(char* result, char* op, char* arg1, char* arg2) +// - emit_unary_op(char* result, char* op, char* arg) +// - emit_assignment(char* target, char* source) +// * Add Bison actions for arithmetic expressions: +// - Addition: $$ = new_temp(); emit_binary_op($$, "ADD", $1, $3); +// - Subtraction, multiplication, division, modulo +#include "symbol_table.h" + +typedef enum {ADD, SUB, MUL, DIV} Op; // TODO: add all the instructions +typedef struct { + Op opcode; + TableNode * result; + TableNode * operand1; + TableNode * operand2; + int label; + int instruction; + Instruction * prev; + Instruction * next; +} Instruction; + +Instruction * start = NULL; +Instruction * current = NULL; + +void emit_binary_op(char* result, char* op, char* arg1, char* arg2); +void emit_unary_op(char* result, char* op, char* arg); +void emit_assignment(char* target, char* source); +// TODO: Find out what these are suposed to do. Guess is create an entry in +// the list of instructions. Guess is that its suposed to ret a struct ptr + + +// * Implement integer/boolean/character specific operation handling +// TODO: Find out what this means. + +// * Create output function to write instructions to file with line formatting +void emit_as_file(FILE * out_file, Instruction * instr_arr); + +// * Implement instruction array storage for backpatching + +void emit_label(char* label); +void emit_jump(char* label); +void emit_conditional_jump(char* condition, char* label); + +void emit_function_start(char* name); +void emit_parameter(char* param); +void emit_function_call(char* result, char* name); +void emit_return(char* value); +void emit_reserve(char* result, char* type_name, int size); +void emit_release(char* pointer); + + +void emit_field_access(char* result, char* record, char* field); +void emit_array_access(char* result, char* array, char* index, char* dimension); +void emit_bounds_check(char* index, char* size, char* error_label); diff --git a/src/lexicalStructure.lex b/src/lexicalStructure.lex index 940681a..e11ef39 100644 --- a/src/lexicalStructure.lex +++ b/src/lexicalStructure.lex @@ -4,8 +4,8 @@ %option noyywrap %option header-file="flex.h" %option yylineno + %{ - #include #include "../tmp/grammar.tab.h" #include "../src/symbol_table.h" #ifndef DEBUG diff --git a/src/runner.c b/src/runner.c index b20f594..5aedc59 100644 --- a/src/runner.c +++ b/src/runner.c @@ -2,25 +2,14 @@ /* The Translators - Spring 2025 */ #include "runner.h" -extern TableNode *funprime; -extern TableNode *arrayprim; -extern TableNode *integ; -extern TableNode *addr; -extern TableNode *chara; -extern TableNode *stri; -extern TableNode *boo; -extern bool DEBUG; -extern char *COLOR_YELLOW; -extern char *COLOR_BLUE; -extern char *COLOR_WHITE; int main(int argc, char *argv[]) { // if last argument is debug then set to true and ignore it for the rest // of this file - if (argc > 1 && strcmp(argv[argc - 1], "-debug") == 0) { - DEBUG = true; - argc--; - } + //if (argc > 1 && strcmp(argv[argc - 1], "-debug") == 0) { + // DEBUG = true; + // argc--; + // } if (argc == 1) { fprintf(stderr, INVALID); @@ -72,6 +61,14 @@ int check_flag(char *arg, char *alpha) { } fprintf(stderr, "FLAGS REPEAT\n"); return -1; + + } else if (strcmp("-tc", arg) == 0) { + if (tc_flag == NULL) { + return new_file(arg, alpha); + } + } else if (strcmp("-debug", arg) == 0) { + DEBUG = true; + return 0; } else { fprintf(stderr, "INVALID FLAG: Use -help for valid inputs\n"); return -1; @@ -91,10 +88,12 @@ void incr(int lnum, int cnum, int tok) { // 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; top = cur = init(CreateScope(NULL, 1, 1)); @@ -143,6 +142,16 @@ int run(FILE *alpha) { if (st_flag != NULL) { yyparse(); + + if (cur == NULL) { + printdebug("%s[FATAL] cur is null", COLOR_LIGHTRED); + } + + if (top == NULL) { + printdebug("%s[FATAL] top is null", COLOR_LIGHTRED); + } + + print_symbol_table(top, st_flag); fclose(st_flag); if (yyin != NULL) { @@ -151,9 +160,14 @@ int run(FILE *alpha) { return 0; } + if (tc_flag != NULL) { + //SCARLETT NEEDS TO ADD THIS FUNCTIONALITY + } + yyparse(); FILE *f = fdopen(1, "w"); - print_symbol_table(getAncestor(cur), f); + + print_symbol_table(top, f); fclose(f); if (yyin != NULL) { @@ -193,7 +207,9 @@ int new_file(char *arg, char *alpha) { type_len = TOK_LEN; } else if (strcmp(arg, "-st") == 0) { type_len = ST_LEN; - } else { + } else if (strcmp(arg, "-tc") == 0){ + type_len = TC_LEN; + }else { fprintf(stderr, "INVALID FLAG: Use -help to view valid inputs\n"); return -1; @@ -213,6 +229,9 @@ int new_file(char *arg, char *alpha) { tok_flag = fopen(file_name, "w"); } else if (strcmp(arg, "-st") == 0) { st_flag = fopen(file_name, "w"); + + } else if (strcmp(arg, "-tc") == 0) { + tc_flag = fopen(file_name, "w"); } return 0; } @@ -223,4 +242,4 @@ int is_alpha_file(char *alpha, int file_len) { return -1; // not alpha file } return 0; // is alpha file -} \ No newline at end of file +} diff --git a/src/runner.h b/src/runner.h index 9678609..0483e12 100644 --- a/src/runner.h +++ b/src/runner.h @@ -4,16 +4,18 @@ #define ALPHA_OFFSET 6 #define TOK_LEN 3 #define ST_LEN 2 +#define TC_LEN 2 #define HELP \ "HELP:\nHow to run the alpha compiler:\n./alpha [options] " \ "program\nValid " \ - "options:\n-tok output the token number, token, line number, and " \ + "options:\n-tok output the token number, token, line number, and " \ "column " \ - "number for each of the tokens to the .tok file\n-st output the " \ + "number for each of the tokens to the .tok file\n-st output the " \ "symbol " \ - "table for the program to the .st file\n-help print this message " \ + "table for the program to the .st file\n-help print this message " \ "and exit " \ - "the alpha compiler\n" + "the alpha compiler\n-debug print debugging messages in grammar rules \n" + #define SET_FLAG 1 // Used to set flags for arg types #define INVALID \ "INVALID INPUT: Include a .alpha file or use -help for more inputs \n" @@ -25,30 +27,57 @@ #include #include "../tmp/flex.h" -#include "symbol_table.h" -// #include "typedefs.h" #include "../tmp/grammar.tab.h" +#include "symbol_table.h" extern int line_number, column_number; extern char *yytext; extern FILE *yyin; -int arg; +extern bool DEBUG; SymbolTable *top; SymbolTable *cur; -// int main(int argc, char* argv[]); -char *is_tok(int argc, char *argv[]); -// int is_alpha_file(char *file, int file_len); - FILE *alpha_file; FILE *tok_flag = NULL; FILE *st_flag = NULL; +FILE *tc_flag = NULL; +bool DEBUG = false; int no_flag = 0; +int arg; + +TableNode *funprime; +TableNode *arrayprim; +TableNode *integ; +TableNode *addr; +TableNode *chara; +TableNode *stri; +TableNode *boo; +TableNode *recprime; +TableNode *funtypeprime; +TableNode *undefined; int main(int argc, char *argv[]); +int check_flag(char *arg, char *alpha); +void incr(int lnum, int cnum, int tok); +void print_tok(int tok); +int run(FILE *alpha); +bool is_help(char *input); int new_file(char *arg, char *alpha); int is_alpha_file(char *alpha, int file_len); -bool is_help(char *input); -int run(FILE *alpha); -int check_flag(char *arg, char *alpha); + +char *COLOR_RED = "\033[0;31m"; +char *COLOR_GREEN = "\033[0;32m"; +char *COLOR_ORANGE = "\033[0;33m"; +char *COLOR_BLUE = "\033[0;34m"; +char *COLOR_PURPLE = "\033[0;35m"; +char *COLOR_CYAN = "\033[0;36m"; +char *COLOR_LIGHTGRAY = "\033[0;37m"; +char *COLOR_DARKGRAY = "\033[1;30m"; +char *COLOR_LIGHTRED = "\033[1;31m"; +char *COLOR_LIGHTGREEN = "\033[1;32m"; +char *COLOR_YELLOW = "\033[1;33m"; +char *COLOR_LIGHTBLUE = "\033[1;34m"; +char *COLOR_LIGHTPURPLE = "\033[1;35m"; +char *COLOR_LIGHTCYAN = "\033[1;36m"; +char *COLOR_WHITE = "\033[1;37m"; diff --git a/src/symbol_table.c b/src/symbol_table.c index 08a0932..1cb6cc8 100644 --- a/src/symbol_table.c +++ b/src/symbol_table.c @@ -3,44 +3,6 @@ #include "symbol_table.h" -#include -#include -#include -#include -char *typey = "type"; -char *funy = "function"; -TableNode *funprime; -TableNode *arrayprim; -extern SymbolTable *cur; -TableNode *integ; -TableNode *addr; -TableNode *chara; -TableNode *stri; -TableNode *boo; -TableNode *recprime; -TableNode *funtypeprime; -TableNode *undefined; - -char *COLOR_RED = "\033[0;31m"; -char *COLOR_GREEN = "\033[0;32m"; -char *COLOR_ORANGE = "\033[0;33m"; -char *COLOR_BLUE = "\033[0;34m"; -char *COLOR_PURPLE = "\033[0;35m"; -char *COLOR_CYAN = "\033[0;36m"; -char *COLOR_LIGHTGRAY = "\033[0;37m"; -char *COLOR_DARKGRAY = "\033[1;30m"; -char *COLOR_LIGHTRED = "\033[1;31m"; -char *COLOR_LIGHTGREEN = "\033[1;32m"; -char *COLOR_YELLOW = "\033[1;33m"; -char *COLOR_LIGHTBLUE = "\033[1;34m"; -char *COLOR_LIGHTPURPLE = "\033[1;35m"; -char *COLOR_LIGHTCYAN = "\033[1;36m"; -char *COLOR_WHITE = "\033[1;37m"; - -bool DEBUG = false; - -void printdebug_impl(char *file, int line, const char *format, ...); - void printdebug_impl(char *file, int line, const char *format, ...) { if (DEBUG) { printf("%s<%s> [%d]%s ", COLOR_DARKGRAY, file, line, @@ -53,88 +15,6 @@ void printdebug_impl(char *file, int line, const char *format, ...) { } } -#define printdebug(format, ...) \ - printdebug_impl(__FILE__, __LINE__, format, ##__VA_ARGS__) - -// AdInfo *Undefined_function_type_info; -typedef enum { - // First 4 below are primitive types that are all encapsulated in - // primitive type - // TYPE_INTEGER, - // TYPE_CHARACTER, - // TYPE_BOOLEAN, - // TYPE_ADDRESS, - // Type String is an array of char enclosed in double quotes per lexer - TYPE_STRING = 1, - // Array can be multidimensional. Information should be stored here. - // This is the type of the array - TYPE_ARRAY_TYPE = 2, - // Record is user defined types - TYPE_RECORD_TYPE = 3, - // Declaring what type a particular function is without as - TYPE_FUNCTION_DECLARATION = 4, - // Declaring what type a particular function is with as - // TYPE_AS_FUNCTION_DECLARATION, - // Declaring what type a function is (what the parameters and output - // are) - TYPE_FUNCTION_TYPE = 5, - // The Type being pointed to by the first 4 above that only stores the - // size - TYPE_PRIMITIVE = 6, - // likely NULL - TYPE_ALL_ELSE = 7, - TYPE_UNDEFINED = 8, - TYPE_RECORD = 9, - TYPE_ARRAY = 10, - TYPE_SYSTEM_DEFINED = 11 // for system defined entries like funprimetype etc. - -} types; - -/* put in symbol_table.h -typedef struct{ - int size; if(strcmp(getType(tn),getName(integ))==0){ - return - } -}primitive_info; - -typedef struct{ - int length; - char* location; -}string_info; - -typedef struct{ - int numofdimensions; - //the above value tells you how long the below array is. For example if num -of dimensions is 5, I can store 1,3,2,5,9 to define > int* sizesofdimensions; - TableNode* typeofarray; -}array_info; - -typedef struct{ - //similar to above we define a record to hold the number of elements and an -array of tablenodes (types) that it contains in the order specified by the user - int numofelements; - TableNode* listoftypes; -}record_info; - -typedef struct{ - int startlinenumber; - bool regularoras; -}function_declaration_info; - -typedef struct{ - TableNode* parameter; - TableNode* returntype; -}function_type_info; - -typedef union { - PrimAdInfo* primitive_info; - ArrayAdInfo* array_info; - RecAdInfo* record_info; - StringAdInfo* string_info; - FunDecAdInfo* func_dec_info; - FunTypeAdInfo* func_type_info; - }AdInfo; -*/ // primitive additional info only stores the size of that type AdInfo *CreatePrimitiveInfo(int size) { @@ -168,19 +48,10 @@ int getPrimSize(TableNode *definition) { return definition->additionalinfo->PrimAdInfo->size; } -// probably don't need the below structure since can create from an array -/*string_info* CreateStringInfo(int length, char* loc){ - string_info* stringy = (string_info*)malloc(sizeof(string_info)); - stringy.length=length; - char* location = loc; - return stringy; -} -*/ - // Only information stored in array info is the number of dimensions and the // type stored in the array per professor, the actual size of the array is // calculated at runtime so bounds checking only needs to be done then -AdInfo *CreateArrayInfo(int dim, /*int* sizes,*/ TableNode *type) { +AdInfo *CreateArrayInfo(int dim, TableNode *type) { if (type == NULL) { printdebug("passed a NULL reference to " "CreateArrayInfo. Invalid."); @@ -933,41 +804,7 @@ SymbolTable *setColumnNumber(SymbolTable *st, int column) { st->Line_Number = column; return st; } -/* -//we use false for type defs and true for functions for parameter of typeOf -TableNode* Define(SymbolTable* table, bool typeOf, char* id) { -if(table ==NULL || table->Parent_Scope != NULL){ - printdebug("No valid table given for header defs"); - return NULL; -} - - TableNode* newEntry = (TableNode*)malloc(sizeof(TableNode)); - -//possible issues with referencing text instead of heap -if(typeOf == 0){ - newEntry->theType = typey; -} -if (typeOf == 1){ - newEntry->theType = funy; -} -if(table_lookup(table,id) != NULL){ - printdebug("already defined at the top level, can't define duplicate -names"); return NULL; -} - newEntry->theName = id; - if (table->entries == NULL) { - table->entries = newEntry; - return newEntry; - } else { - TableNode* oldEntry = table->entries; - table->entries = newEntry; - newEntry->next = oldEntry; - return newEntry; - } - -} -*/ // only check table that is given TableNode *table_lookup(SymbolTable *table, char *x) { if (table == NULL) { @@ -982,6 +819,7 @@ TableNode *table_lookup(SymbolTable *table, char *x) { } return undefined; } + // check current table and all parents TableNode *look_up(SymbolTable *table, char *x) { if (table == NULL) { @@ -998,61 +836,9 @@ TableNode *look_up(SymbolTable *table, char *x) { x, getLine(table), getColumn(table)); return look_up(table->Parent_Scope, x); } -/* + void print_symbol_table(SymbolTable *table, FILE *file_ptr) { - if (table->Parent_Scope == NULL) { - fprintf(file_ptr, "%-17s: %-6s : %-6s : %-21s: %-28s\n", "NAME", - "SCOPE", "PARENT", "TYPE", "Extra annotation"); - } - TableNode *entrie = table->entries; - fprintf(file_ptr, "-----------------:--------:--------:----------------" - "------:---------" - "--------------------\n"); - int parant_scope = 0; - int current_scope = 0; - if (table->Parent_Scope != NULL) { - parant_scope = table->Parent_Scope->Line_Number * 1000 + - table->Parent_Scope->Column_Number; - current_scope = - table->Line_Number * 1000 + table->Column_Number; - } else { - current_scope = 1001; - } - if (entrie == NULL) { - fprintf(file_ptr, "%-17s: %06d : %06d : %-21s: %-28s\n", "", - current_scope, parant_scope, "", "Empty Scope"); - } - for (; entrie != NULL; entrie = entrie->next) { - if (parant_scope == 0) { - /*have to update if (strcmp(entrie->theType->theName, - "function primitive") || - strcmp(entrie->theType->theName, - "array")) { - } - fprintf(file_ptr, - "%-17s: %06d : : %-21s: %-28s\n", - entrie->theName, current_scope, - entrie->theType->theName, "Extra annotation"); - } else { - fprintf(file_ptr, "%-17s: %06d : %06d : %-21s: %-28s\n", - entrie->theName, current_scope, parant_scope, - entrie->theType->theName, "Extra annotation"); - } - } - if (table->Children_Scope != NULL) { - ListOfTable *node = table->Children_Scope; - for (; node != NULL; node = node->next) { - print_symbol_table(node->table, file_ptr); - } - } - if (table->Parent_Scope == NULL) { - fprintf(file_ptr, "-----------------:--------:--------:--------" - "--------------:-------" - "----------------------\n"); - } -}*/ -void print_symbol_table(SymbolTable *table, FILE *file_ptr) { if (table == NULL) { printdebug( "%s[FATAL] passed in NULL table to print_symbol_table", @@ -1352,20 +1138,3 @@ TableNode *getNextEntry(TableNode *tn) { } return tn->next; } - -// uncomment the below main function along with the headers above for a simple -// standalone test of table and entry creation - -/* - int main(){ - char* String = "STRING"; - char* X = "X"; - SymbolTable* Second = CreateScope(NULL, 2,2); - printdebug("Line number is %d, Column number of scope is - %d",Second->Line_Number,Second->Column_Number); TableNode* First_Entry = - CreateEntry(Second,String,X); - - printdebug("The type of the first entry is %s",First_Entry->theType); - return 0; - } - */ diff --git a/src/symbol_table.h b/src/symbol_table.h index f223b8a..53c2fa2 100644 --- a/src/symbol_table.h +++ b/src/symbol_table.h @@ -1,3 +1,4 @@ +#include #include #include #include @@ -15,26 +16,12 @@ typedef struct { int size; } primitive_info; -/*This structure can be subsumed into the structure below (1-d array of chars) -typedef struct{ - //shouldn't need to store any values since would be compiled at runtime - //int length; - //char* location; -}string_info; -*/ - typedef struct { int numofdimensions; - // the above value tells you how long the below array is. For example if - // num of dimensions is 5, I can store 1,3,2,5,9 to define > int* - // arr; shouldn't need to store any values (like sizes of dimenions or - // the location int* sizesofdimensions; do have to store type of array struct TableNode *typeofarray; } array_info; typedef struct { - // similar to above we define a record to hold the number of elements - // and an array of tablenodes (types) that it contains in the > int numofelements; struct SymbolTable *recordScope; } record_info; @@ -53,20 +40,17 @@ typedef union { primitive_info *PrimAdInfo; array_info *ArrayAdInfo; record_info *RecAdInfo; - // string_info* StringAdInfo; function_declaration_info *FunDecAdInfo; function_type_info *FunTypeAdInfo; } AdInfo; typedef struct ListOfTable { struct SymbolTable *table; - // struct ListOfTable* prev; struct ListOfTable *next; } ListOfTable; //Table node to store typedef struct TableNode { - // reference to the type entry that this is struct TableNode *theType; int tag; char *theName; @@ -82,30 +66,100 @@ typedef struct SymbolTable { int Column_Number; } SymbolTable; +typedef enum { + TYPE_STRING = 1, + TYPE_ARRAY_TYPE = 2, + TYPE_RECORD_TYPE = 3, + TYPE_FUNCTION_DECLARATION = 4, + TYPE_FUNCTION_TYPE = 5, + TYPE_PRIMITIVE = 6, + TYPE_ALL_ELSE = 7, + TYPE_UNDEFINED = 8, + TYPE_RECORD = 9, + TYPE_ARRAY = 10 +} types; + +AdInfo *CreatePrimitiveInfo(int size); +int getPrimSize(TableNode *definition); +AdInfo *CreateArrayInfo(int dim, TableNode *type); +int getNumArrDim(TableNode *definition); +TableNode *getArrType(TableNode *definition); +AdInfo *CreateRecordInfo(int length, SymbolTable *recordScope); +int getRecLength(TableNode *definition); +SymbolTable *getRecList(TableNode *definition); +TableNode *setRecSize(TableNode *tn, int n); +int getRecSize(SymbolTable *tn); +AdInfo *CreateFunctionDeclarationInfo(int line, bool asorregular); +int getStartLine(TableNode *definition); +TableNode *setStartLine(TableNode *tn, int start); +bool getAsKeyword(TableNode *definition); +TableNode *setAsKeyword(TableNode *tn, bool as); +AdInfo *CreateFunctionTypeInfo(TableNode *parameter, TableNode *returntype); +TableNode *getParameter(TableNode *definition); +TableNode *getReturn(TableNode *definition); SymbolTable *CreateScope(SymbolTable *ParentScope, int Line, int Column); +SymbolTable *init(SymbolTable *start); +TableNode *populateTypeAndInfo(TableNode *tn, TableNode *type, AdInfo *info); +int getAdInfoType(TableNode *tn); +TableNode *CreateEntry(SymbolTable *table, TableNode *typeOf, char *id, + AdInfo *ad); +char *getType(TableNode *tn); +char *getName(TableNode *tn); +int getLine(SymbolTable *st); +int getColumn(SymbolTable *st); +TableNode *addName(TableNode *tn, char *str); +SymbolTable *setLineNumber(SymbolTable *st, int line); +SymbolTable *setColumnNumber(SymbolTable *st, int column); TableNode *table_lookup(SymbolTable *table, char *x); TableNode *look_up(SymbolTable *table, char *x); void print_symbol_table(SymbolTable *table, FILE *file_ptr); - SymbolTable *getAncestor(SymbolTable *table); +SymbolTable *removeEntry(SymbolTable *scope, char *search); +bool typeCheck(char *firstID, char *secondID); SymbolTable *getParent(SymbolTable *st); ListOfTable *getChildren(SymbolTable *st); SymbolTable *getFirstChild(ListOfTable *lt); ListOfTable *getRestOfChildren(ListOfTable *lt); TableNode *getFirstEntry(SymbolTable *st); TableNode *getNextEntry(TableNode *tn); -SymbolTable *init(SymbolTable *scope); -int getPrimSize(TableNode *definition); -int getNumArrDim(TableNode *definition); -TableNode *getArrType(TableNode *definition); -int getRecLength(TableNode *definition); -SymbolTable *getRecList(TableNode *definition); -int getStartLine(TableNode *definition); -bool getAsKeyword(TableNode *definition); -TableNode *getParameter(TableNode *definition); -TableNode *getReturn(TableNode *definition); -char *getType(TableNode *tn); -char *getName(TableNode *tn); -int getLine(SymbolTable *st); -int getColumn(SymbolTable *st); +void printdebug_impl(char *file, int line, const char *format, ...); +#define printdebug(format, ...) \ + printdebug_impl(__FILE__, __LINE__, format, ##__VA_ARGS__) + +extern int yylex(void); +extern char *yytext; +extern int yyleng; +extern int yychar; +extern SymbolTable *cur; +extern int line_number; +extern int column_number; +extern FILE *yyin; +extern bool DEBUG; + +extern TableNode *funprime; +extern TableNode *arrayprim; +extern TableNode *integ; +extern TableNode *addr; +extern TableNode *chara; +extern TableNode *stri; +extern TableNode *boo; +extern TableNode *recprime; +extern TableNode *funtypeprime; +extern TableNode *undefined; + +extern char *COLOR_RED; +extern char *COLOR_GREEN; +extern char *COLOR_ORANGE; +extern char *COLOR_BLUE; +extern char *COLOR_PURPLE; +extern char *COLOR_CYAN; +extern char *COLOR_LIGHTGRAY; +extern char *COLOR_DARKGRAY; +extern char *COLOR_LIGHTRED; +extern char *COLOR_LIGHTGREEN; +extern char *COLOR_YELLOW; +extern char *COLOR_LIGHTBLUE; +extern char *COLOR_LIGHTPURPLE; +extern char *COLOR_LIGHTCYAN; +extern char *COLOR_WHITE; \ No newline at end of file diff --git a/test.sh b/test.sh index 9c32bed..8443215 100755 --- a/test.sh +++ b/test.sh @@ -48,7 +48,7 @@ if [ $# -eq 0 ]; then if [ -f "$file" ]; then filename=$(basename -- "$file") echo -e "- ${SWITCH}Running test: ${LIGHTBLUE}$filename ${SWITCH}-----${WHITE}" - ./alpha -st "$file" -debug + ./alpha -st -debug "$file" echo -e "${SWITCH}----- End of test: ${LIGHTBLUE}$filename ${SWITCH}-${WHITE}\n" switchfunc fi @@ -60,7 +60,7 @@ if [ $# -eq 0 ]; then if [ -f "$file" ]; then filename=$(basename -- "$file") echo -e "- ${SWITCH}Running test: ${LIGHTBLUE}$filename ${SWITCH}-----${WHITE}" - ./alpha -st "$file" -debug + ./alpha -st -debug "$file" echo -e "${SWITCH}----- End of test: ${LIGHTBLUE}$filename ${SWITCH}-${WHITE}\n" switchfunc fi @@ -72,7 +72,7 @@ if [ $# -eq 0 ]; then if [ -f "$file" ]; then filename=$(basename -- "$file") echo -e "- ${SWITCH}Running test: ${LIGHTBLUE}$filename ${SWITCH}-----${WHITE}" - ./alpha -st "$file" -debug + ./alpha -st -debug "$file" echo -e "${SWITCH}----- End of test: ${LIGHTBLUE}$filename ${SWITCH}-${WHITE}\n" switchfunc fi @@ -84,7 +84,7 @@ if [ $# -eq 0 ]; then if [ -f "$file" ]; then filename=$(basename -- "$file") echo -e "- ${SWITCH}Running test: ${LIGHTBLUE}$filename ${SWITCH}-----${WHITE}" - ./alpha -st "$file" -debug + ./alpha -st -debug "$file" echo -e "${SWITCH}----- End of test: ${LIGHTBLUE}$filename ${SWITCH}-${WHITE}\n${WHITE}" switchfunc fi @@ -106,7 +106,7 @@ else if [ -f "$1" ]; then filename=$(basename -- "$1") echo -e "- ${SWITCH}Running test: ${LIGHTBLUE}$filename ${SWITCH}-----${WHITE}" - ./alpha -st "$1" -debug + ./alpha -st -debug "$1" echo -e "${SWITCH}----- End of test: ${LIGHTBLUE}$filename ${SWITCH}-${WHITE}" exit 1 else @@ -121,7 +121,7 @@ else if [[ "$file" == *"$1"* ]]; then filename=$(basename -- "$file") echo -e "- ${SWITCH}Running test: ${LIGHTBLUE}$filename ${SWITCH}-----${WHITE}" - ./alpha -st "$file" -debug + ./alpha -st -debug "$file" echo -e "${SWITCH}----- End of test: ${LIGHTBLUE}$filename ${SWITCH}-${WHITE}\n" switchfunc fi @@ -132,7 +132,7 @@ else if [[ "$file" == *"$1"* ]]; then filename=$(basename -- "$file") echo -e "- ${SWITCH}Running test: ${LIGHTBLUE}$filename ${SWITCH}-----${WHITE}" - ./alpha -st "$file" -debug + ./alpha -st -debug "$file" echo -e "${SWITCH}----- End of test: ${LIGHTBLUE}$filename ${SWITCH}-${WHITE}\n" switchfunc fi @@ -143,7 +143,7 @@ else if [[ "$file" == *"$1"* ]]; then filename=$(basename -- "$file") echo -e "- ${SWITCH}Running test: ${LIGHTBLUE}$filename ${SWITCH}-----${WHITE}" - ./alpha -st "$file" -debug + ./alpha -st -debug "$file" echo -e "${SWITCH}----- End of test: ${LIGHTBLUE}$filename ${SWITCH}-${WHITE}\n" switchfunc fi @@ -154,7 +154,7 @@ else if [[ "$file" == *"$1"* ]]; then filename=$(basename -- "$file") echo -e "- ${SWITCH}Running test: ${LIGHTBLUE}$filename ${SWITCH}-----${WHITE}" - ./alpha -st "$file" -debug + ./alpha -st -debug "$file" echo -e "${SWITCH}----- End of test: ${LIGHTBLUE}$filename ${SWITCH}-${WHITE}\n" switchfunc fi @@ -163,4 +163,4 @@ else echo -e "${RED}[ERROR] ${YELLOW}Invalid prefix $1!${WHITE}" exit 1 fi -fi \ No newline at end of file +fi diff --git a/tests/sprint2/expected/sp2_carls_mistake.expected b/tests/sprint2/expected/sp2_carls_mistake.expected new file mode 100644 index 0000000..23a8694 --- /dev/null +++ b/tests/sprint2/expected/sp2_carls_mistake.expected @@ -0,0 +1,31 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +bar2 : 001001 : : T2 : User Defined +bar1 : 001001 : : T2 : User Defined +foo : 001001 : : T1 : User Defined +arr : 001001 : : 1 -> integer : Type of Array +T2 : 001001 : : primitive function type : User Defined +T1 : 001001 : : primitive function type : User Defined +rec : 001001 : : record : elements-2 +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +w : 026000 : 001001 : rec : User Defined +result : 026000 : 001001 : integer : User Defined +arg : 026000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +r : 021000 : 001001 : integer : User Defined +s : 021000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +a : 017000 : 001001 : rec : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +x : 013000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +y : 004000 : 001001 : integer : User Defined +x : 004000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint2/expected/sp2_function_types.expected b/tests/sprint2/expected/sp2_function_types.expected new file mode 100644 index 0000000..bd1d2ce --- /dev/null +++ b/tests/sprint2/expected/sp2_function_types.expected @@ -0,0 +1,26 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +entry : 001001 : : string2integer : User Defined +integer2integer2integerFunc: 001001 : : integer2integer2integer : User Defined +released : 001001 : : address2integer : User Defined +reserved : 001001 : : integer2address : User Defined +printBoolean : 001001 : : Boolean2integer : User Defined +printCharacter : 001001 : : character2integer : User Defined +printInteger : 001001 : : integer2integer : User Defined +integer2integer2integer : 001001 : : primitive function type : User Defined +address2integer : 001001 : : primitive function type : User Defined +integer2address : 001001 : : primitive function type : User Defined +Boolean2Boolean2Boolean : 001001 : : primitive function type : User Defined +character2character2Boolean: 001001 : : primitive function type : User Defined +integer2integer2Boolean : 001001 : : primitive function type : User Defined +string2integer : 001001 : : primitive function type : User Defined +Boolean2integer : 001001 : : primitive function type : User Defined +character2integer : 001001 : : primitive function type : User Defined +integer2integer : 001001 : : primitive function type : User Defined +Boolean2Boolean : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint2/expected/sp2_integer_binary_op.expected b/tests/sprint2/expected/sp2_integer_binary_op.expected new file mode 100644 index 0000000..299c09d --- /dev/null +++ b/tests/sprint2/expected/sp2_integer_binary_op.expected @@ -0,0 +1,17 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +b1 : 005000 : 001001 : Boolean : User Defined +b2 : 005000 : 001001 : Boolean : User Defined +arr2 : 005000 : 001001 : address : User Defined +arr : 005000 : 001001 : address : User Defined +x : 005000 : 001001 : integer : User Defined +arg : 005000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint2/expected/sp2_invalid_recop.expected b/tests/sprint2/expected/sp2_invalid_recop.expected new file mode 100644 index 0000000..5274102 --- /dev/null +++ b/tests/sprint2/expected/sp2_invalid_recop.expected @@ -0,0 +1,17 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +rec : 001001 : : record : elements-2 +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +w : 007000 : 001001 : rec : User Defined +arg : 007000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +y : 004000 : 001001 : integer : User Defined +x : 004000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint2/expected/sp2_invalid_release.expected b/tests/sprint2/expected/sp2_invalid_release.expected new file mode 100644 index 0000000..de26852 --- /dev/null +++ b/tests/sprint2/expected/sp2_invalid_release.expected @@ -0,0 +1,14 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +rec : 001001 : : record : elements-2 +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +w : 004000 : 001001 : rec : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +y : 001000 : 001001 : integer : User Defined +x : 001000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint2/expected/sp2_library.expected b/tests/sprint2/expected/sp2_library.expected new file mode 100644 index 0000000..a1318bd --- /dev/null +++ b/tests/sprint2/expected/sp2_library.expected @@ -0,0 +1,36 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +entry : 001001 : : string2integer : User Defined +printBoolean : 001001 : : Boolean2integer : User Defined +printCharacter : 001001 : : character2integer : User Defined +printInteger : 001001 : : integer2integer : User Defined +address2integer : 001001 : : primitive function type : User Defined +integer2address : 001001 : : primitive function type : User Defined +BooleanXBoolean2Boolean : 001001 : : primitive function type : User Defined +characterXcharacter2Boolean: 001001 : : primitive function type : User Defined +integerXinteger2Boolean : 001001 : : primitive function type : User Defined +integerXinteger2integer : 001001 : : primitive function type : User Defined +string2integer : 001001 : : primitive function type : User Defined +Boolean2integer : 001001 : : primitive function type : User Defined +character2integer : 001001 : : primitive function type : User Defined +integer2integer : 001001 : : primitive function type : User Defined +Boolean2Boolean : 001001 : : primitive function type : User Defined +integerXinteger : 001001 : : record : elements-2 +characterXcharacter : 001001 : : record : elements-2 +BooleanXBoolean : 001001 : : record : elements-2 +string : 001001 : : 1 -> character : Type of Array +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +y : 015000 : 001001 : integer : User Defined +x : 015000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +y : 014000 : 001001 : character : User Defined +x : 014000 : 001001 : character : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +y : 013000 : 001001 : Boolean : User Defined +x : 013000 : 001001 : Boolean : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint2/expected/sp2_llnode.expected b/tests/sprint2/expected/sp2_llnode.expected new file mode 100644 index 0000000..dfe8d53 --- /dev/null +++ b/tests/sprint2/expected/sp2_llnode.expected @@ -0,0 +1,62 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +make_list : 001001 : : list : User Defined +bar2 : 001001 : : T2 : User Defined +bar1 : 001001 : : T2 : User Defined +foo : 001001 : : T1 : User Defined +list : 001001 : : primitive function type : User Defined +llnode : 001001 : : record : elements-3 +T2 : 001001 : : primitive function type : User Defined +T1 : 001001 : : primitive function type : User Defined +rec : 001001 : : record : elements-2 +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +li : 070000 : 001001 : llnode : User Defined +w : 070000 : 001001 : rec : User Defined +result : 070000 : 001001 : integer : User Defined +arg : 070000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +r : 054000 : 001001 : integer : User Defined +s : 054000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +x : 060009 : 054000 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ + : 062028 : 060009 : : Empty Scope +-------------------------:--------:--------:--------------------------:------------------------------ + : 055021 : 054000 : : Empty Scope +-------------------------:--------:--------:--------------------------:------------------------------ + : 056026 : 055021 : : Empty Scope +-------------------------:--------:--------:--------------------------:------------------------------ +a : 050000 : 001001 : rec : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +x : 046000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +temp : 017000 : 001001 : address : User Defined +curr : 017000 : 001001 : address : User Defined +ret : 017000 : 001001 : address : User Defined +orig_a : 017000 : 001001 : integer : User Defined +a : 017000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ + : 021012 : 017000 : : Empty Scope +-------------------------:--------:--------:--------------------------:------------------------------ + : 026023 : 021012 : : Empty Scope +-------------------------:--------:--------:--------------------------:------------------------------ + : 035020 : 026023 : : Empty Scope +-------------------------:--------:--------:--------------------------:------------------------------ + : 031034 : 026023 : : Empty Scope +-------------------------:--------:--------:--------------------------:------------------------------ + : 019029 : 017000 : : Empty Scope +-------------------------:--------:--------:--------------------------:------------------------------ +next : 008000 : 001001 : llnode : User Defined +val : 008000 : 001001 : integer : User Defined +prev : 008000 : 001001 : llnode : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +y : 004000 : 001001 : integer : User Defined +x : 004000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint2/expected/sp2_one_line.expected b/tests/sprint2/expected/sp2_one_line.expected new file mode 100644 index 0000000..8dde170 --- /dev/null +++ b/tests/sprint2/expected/sp2_one_line.expected @@ -0,0 +1,30 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +bar2 : 001001 : : T2 : User Defined +bar1 : 001001 : : T2 : User Defined +foo : 001001 : : T1 : User Defined +T2 : 001001 : : primitive function type : User Defined +T1 : 001001 : : primitive function type : User Defined +rec : 001001 : : record : elements-2 +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +w : 001000 : 001001 : rec : User Defined +result : 001000 : 001001 : integer : User Defined +arg : 001000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +r : 001000 : 001001 : integer : User Defined +s : 001000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +a : 001000 : 001001 : rec : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +x : 001000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +y : 001000 : 001001 : integer : User Defined +x : 001000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint2/expected/sp2_presidence.expected b/tests/sprint2/expected/sp2_presidence.expected new file mode 100644 index 0000000..70d9f83 --- /dev/null +++ b/tests/sprint2/expected/sp2_presidence.expected @@ -0,0 +1,13 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +x : 005000 : 001001 : integer : User Defined +arg : 005000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint2/expected/sp2_simple.expected b/tests/sprint2/expected/sp2_simple.expected new file mode 100644 index 0000000..8d55a97 --- /dev/null +++ b/tests/sprint2/expected/sp2_simple.expected @@ -0,0 +1,12 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +arg : 005000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint2/expected/sp2_valid_assignable_and_mem.expected b/tests/sprint2/expected/sp2_valid_assignable_and_mem.expected new file mode 100644 index 0000000..ab5cb2a --- /dev/null +++ b/tests/sprint2/expected/sp2_valid_assignable_and_mem.expected @@ -0,0 +1,18 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +T2 : 001001 : : primitive function type : User Defined +rec : 001001 : : record : elements-2 +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +w : 008000 : 001001 : rec : User Defined +arg : 008000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ +y : 004000 : 001001 : integer : User Defined +x : 004000 : 001001 : integer : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint2/test/sp2_carls_mistake.alpha b/tests/sprint2/test/sp2_carls_mistake.alpha index daca47e..8d705a7 100644 --- a/tests/sprint2/test/sp2_carls_mistake.alpha +++ b/tests/sprint2/test/sp2_carls_mistake.alpha @@ -1,28 +1,35 @@ +type main: string -> integer +function entry: main + type rec: [integer: x; integer: y] type T1: integer -> integer type T2: rec -> integer -type arr : 1 -> integer +type arr: 1 -> integer -function foo : T1 -function bar1 : T2 -function bar2 : T2 +function foo: T1 +function bar1: T2 +function bar2: T2 -foo(x) := { - return x * x; +foo (x) := { + return x * x; } -bar1(a) := { - return a.x * a.y; + +bar1 (a) := { + return a.x * a.y; } + bar2 as (r,s) := { - return r * s; + return r * s; } -entry(arg) := { - [ integer: result ; rec: w] - result := foo(5); - w := reserve w; (* see types.alpha – reserve returns a value of type address, which can be assigned to array and record variables*) - w.x := 5; - w.y := 7; - result := bar1(w); (* pass w (a rec type value) to bar1 *) - result := bar2(5,7); (* implicitly build a rec type value, assign 5 and 7 to fields x and y, but call them r and s *) - return 0; -} \ No newline at end of file + +entry (arg) := { + [ integer: result ; rec: w] + result := foo(5); + w := reserve w; (* see types.alpha – reserve returns a value of type address, which can be assigned to array and record variables*) + w.x := 5; + w.y := 7; + result := bar1(w); (* pass w (a rec type value) to bar1 *) + result := bar2(5,7); (* implicitly build a rec type value, assign 5 and 7 to fields x and y, but call them r and s *) + return 0; +} + diff --git a/tests/sprint2/test/sp2_function_types.alpha b/tests/sprint2/test/sp2_function_types.alpha index 509de78..62711c3 100644 --- a/tests/sprint2/test/sp2_function_types.alpha +++ b/tests/sprint2/test/sp2_function_types.alpha @@ -3,15 +3,19 @@ type integer2integer: integer -> integer type character2integer: character -> integer type Boolean2integer: Boolean -> integer type string2integer: string -> integer -function integerXinteger2integer: integerXinteger (*-> integer -type integerXinteger2Boolean: integerXinteger -> Boolean -type characterXcharacter2Boolean: characterXcharacter -> Boolean -type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean + +type integer2integer2Boolean: integer2integer -> Boolean +type character2character2Boolean: character2character -> Boolean +type Boolean2Boolean2Boolean: Boolean2Boolean -> Boolean type integer2address: integer -> address type address2integer: address -> integer +type integer2integer2integer: integer2integer -> integer + external function printInteger: integer2integer external function printCharacter: character2integer external function printBoolean: Boolean2integer -external function reserve: integer2address -external function release: address2integer -function entry: string2integer*) \ No newline at end of file +external function reserved: integer2address +external function released: address2integer + +function integer2integer2integerFunc: integer2integer2integer +function entry: string2integer \ No newline at end of file diff --git a/tests/sprint2/test/sp2_integer_binary_op.alpha b/tests/sprint2/test/sp2_integer_binary_op.alpha index 39e00a6..856224f 100644 --- a/tests/sprint2/test/sp2_integer_binary_op.alpha +++ b/tests/sprint2/test/sp2_integer_binary_op.alpha @@ -1,12 +1,17 @@ -entry(arg) := { - [integer:x; address: arr; address: arr2; Boolean : b2; Boolean : b1] - x := 3 + 2 * 8; - x := 3 - 2 / 8; - x := 3 * 2 % 8; - x := 3 * 2 % 8; - x := 3 % 2 * 8; - x := 3 + 2 - 8; - arr2 := 1 * reserve x; +type main: string -> integer +function entry: main + +entry (arg) := { + [integer:x; address: arr; address: arr2; Boolean : b2; Boolean : b1] + + x := 3 + 2 * 8; + x := 3 - 2 / 8; + x := 3 * 2 % 8; + x := 3 * 2 % 8; + x := 3 % 2 * 8; + x := 3 + 2 - 8; + + arr2 := 1 * reserve x; arr2 := release x; b2 := 3 < 2; b1 := 1 = 2; diff --git a/tests/sprint2/test/sp2_invalid_recop.alpha b/tests/sprint2/test/sp2_invalid_recop.alpha index 5ea874d..41b3a55 100644 --- a/tests/sprint2/test/sp2_invalid_recop.alpha +++ b/tests/sprint2/test/sp2_invalid_recop.alpha @@ -1,10 +1,13 @@ +type main: string -> integer +function entry: main + type rec: [integer: x; integer: y] -entry(arg) := { +entry (arg) := { [rec: w] w := reserve w; w.x := 1; w.y := 2; w.z := 3; - return 0; + return 0; } \ No newline at end of file diff --git a/tests/sprint2/test/sp2_invalid_release.alpha b/tests/sprint2/test/sp2_invalid_release.alpha index 41fbd8a..2bd645a 100644 --- a/tests/sprint2/test/sp2_invalid_release.alpha +++ b/tests/sprint2/test/sp2_invalid_release.alpha @@ -1,8 +1,8 @@ type rec: [integer: x; integer: y] -entry(arg) := { - [rec: w] - w := reserve w; - w := release (w); - return 0; +entry (arg) := { + [rec: w] + w := reserve w; + w := release (w); + return 0; } \ No newline at end of file diff --git a/tests/sprint2/test/sp2_library.alpha b/tests/sprint2/test/sp2_library.alpha index 866857c..82120be 100644 --- a/tests/sprint2/test/sp2_library.alpha +++ b/tests/sprint2/test/sp2_library.alpha @@ -1,11 +1,14 @@ -(* At compiler start-up your program should create symbol table entries for the four primitive types: - Boolean (1 byte) - character (1 byte) - integer (4 bytes) - address (8 bytes) -You should #include this file at the start of your alpha file. -Some useful types are defined below. +(* + At compiler start-up your program should create symbol table entries for the four primitive types: + Boolean (1 byte) + character (1 byte) + integer (4 bytes) + address (8 bytes) + + should #include this file at the start of your alpha file. + Some useful types are defined below. *) + type string: 1 -> character type BooleanXBoolean: [Boolean: x; Boolean: y] type characterXcharacter: [character: x; character: y] @@ -22,7 +25,9 @@ type characterXcharacter2Boolean: characterXcharacter -> Boolean type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean type integer2address: integer -> address type address2integer: address -> integer + external function printInteger: integer2integer external function printCharacter: character2integer external function printBoolean: Boolean2integer + function entry: string2integer diff --git a/tests/sprint2/test/sp2_llnode.alpha b/tests/sprint2/test/sp2_llnode.alpha index 6b4912e..2011a83 100644 --- a/tests/sprint2/test/sp2_llnode.alpha +++ b/tests/sprint2/test/sp2_llnode.alpha @@ -1,3 +1,6 @@ +type main: string -> integer +function entry: main + type rec: [integer: x; integer: y] type T1: integer -> integer type T2: rec -> integer @@ -9,66 +12,70 @@ 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; + +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; +} -foo(x) := { - return x * x; - } -bar1(a) := { - return a.x * a.y; - } +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; - } + if (r < s) then { + while (!(r < s)) { + r := r + 1; } - 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; + } 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; } diff --git a/tests/sprint2/test/sp2_one_line.alpha b/tests/sprint2/test/sp2_one_line.alpha index 9031b5f..f1062e9 100644 --- a/tests/sprint2/test/sp2_one_line.alpha +++ b/tests/sprint2/test/sp2_one_line.alpha @@ -1 +1 @@ -type rec: [integer: x; integer: y] type T1: integer -> integer type T2: rec -> integer function foo : T1 function bar1 : T2 function bar2 : T2 foo(x) := { return x * x; } bar1(a) := { return a.x * a.y; } bar2 as (r,s) := { return r * s; } entry(arg) := { [ integer: result ; rec: w] result := foo(5); w := reserve w; w.x := 5; w.y := 7; result := bar1(w); result := bar2(5,7); return 0; } +type main: string -> integer function entry: main type rec: [integer: x; integer: y] type T1: integer -> integer type T2: rec -> integer function foo : T1 function bar1 : T2 function bar2 : T2 foo(x) := { return x * x; } bar1(a) := { return a.x * a.y; } bar2 as (r,s) := { return r * s; } entry(arg) := { [ integer: result ; rec: w] result := foo(5); w := reserve w; w.x := 5; w.y := 7; result := bar1(w); result := bar2(5,7); return 0; } diff --git a/tests/sprint2/test/sp2_presidence.alpha b/tests/sprint2/test/sp2_presidence.alpha index 9b2ef86..2d60209 100644 --- a/tests/sprint2/test/sp2_presidence.alpha +++ b/tests/sprint2/test/sp2_presidence.alpha @@ -1,4 +1,8 @@ -entry(arg) := { - [integer:x] - x := 3 + 2 * 8; +type main: string -> integer +function entry: main + +entry (arg) := { + [integer:x] + x := 3 + 2 * 8; + return 0; } diff --git a/tests/sprint2/test/sp2_simple.alpha b/tests/sprint2/test/sp2_simple.alpha index 0b214c3..5f60c1b 100644 --- a/tests/sprint2/test/sp2_simple.alpha +++ b/tests/sprint2/test/sp2_simple.alpha @@ -1,5 +1,7 @@ +type main: string -> integer +function entry: main entry(arg) := { [int : x] - return 0; + return 0; } diff --git a/tests/sprint2/test/sp2_valid_assignable_and_mem.alpha b/tests/sprint2/test/sp2_valid_assignable_and_mem.alpha index 43c5a5f..a49c5dd 100644 --- a/tests/sprint2/test/sp2_valid_assignable_and_mem.alpha +++ b/tests/sprint2/test/sp2_valid_assignable_and_mem.alpha @@ -1,12 +1,16 @@ +type main: string -> integer +function entry: main + type rec: [integer: x; integer: y] type T2: rec -> integer entry(arg) := { - [rec: w] - w := reserve w; + [rec: w] + + w := reserve w; w.x := 1; w.y := 2; w := release w; - return 0; - + + return 0; } \ No newline at end of file diff --git a/tests/sprint3/expected/sp3_boolean_binary_op_typecheck.expected b/tests/sprint3/expected/sp3_boolean_binary_op_typecheck.expected new file mode 100644 index 0000000..299c09d --- /dev/null +++ b/tests/sprint3/expected/sp3_boolean_binary_op_typecheck.expected @@ -0,0 +1,17 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +b1 : 005000 : 001001 : Boolean : User Defined +b2 : 005000 : 001001 : Boolean : User Defined +arr2 : 005000 : 001001 : address : User Defined +arr : 005000 : 001001 : address : User Defined +x : 005000 : 001001 : integer : User Defined +arg : 005000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint3/expected/sp3_boolean_unary_op_typecheck.expected b/tests/sprint3/expected/sp3_boolean_unary_op_typecheck.expected new file mode 100644 index 0000000..299c09d --- /dev/null +++ b/tests/sprint3/expected/sp3_boolean_unary_op_typecheck.expected @@ -0,0 +1,17 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +b1 : 005000 : 001001 : Boolean : User Defined +b2 : 005000 : 001001 : Boolean : User Defined +arr2 : 005000 : 001001 : address : User Defined +arr : 005000 : 001001 : address : User Defined +x : 005000 : 001001 : integer : User Defined +arg : 005000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint3/expected/sp3_carls_second_mistake.expected b/tests/sprint3/expected/sp3_carls_second_mistake.expected new file mode 100644 index 0000000..5d0682f --- /dev/null +++ b/tests/sprint3/expected/sp3_carls_second_mistake.expected @@ -0,0 +1,17 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +a_of_s : 001001 : : 1 -> string : Type of Array +string : 001001 : : 1 -> character : Type of Array +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +many_names : 010000 : 001001 : a_of_s : User Defined +another_name : 010000 : 001001 : string : User Defined +one_name : 010000 : 001001 : string : User Defined +arg : 010000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint3/expected/sp3_integer_binary_op_typecheck.expected b/tests/sprint3/expected/sp3_integer_binary_op_typecheck.expected new file mode 100644 index 0000000..a183cf5 --- /dev/null +++ b/tests/sprint3/expected/sp3_integer_binary_op_typecheck.expected @@ -0,0 +1,18 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +a : 005000 : 001001 : character : User Defined +b1 : 005000 : 001001 : Boolean : User Defined +b2 : 005000 : 001001 : Boolean : User Defined +arr2 : 005000 : 001001 : address : User Defined +arr : 005000 : 001001 : address : User Defined +x : 005000 : 001001 : integer : User Defined +arg : 005000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint3/expected/sp3_integer_unary_op_typecheck.expected b/tests/sprint3/expected/sp3_integer_unary_op_typecheck.expected new file mode 100644 index 0000000..299c09d --- /dev/null +++ b/tests/sprint3/expected/sp3_integer_unary_op_typecheck.expected @@ -0,0 +1,17 @@ +NAME : SCOPE : PARENT : TYPE : Extra annotation +-------------------------:--------:--------:--------------------------:------------------------------ +entry : 001001 : : main : User Defined +main : 001001 : : primitive function type : User Defined +integer : 001001 : : Primitive : size-4 bytes +address : 001001 : : Primitive : size-8 bytes +character : 001001 : : Primitive : size-1 bytes +string : 001001 : : 1 -> character : Type of Array +Boolean : 001001 : : Primitive : size-1 bytes +-------------------------:--------:--------:--------------------------:------------------------------ +b1 : 005000 : 001001 : Boolean : User Defined +b2 : 005000 : 001001 : Boolean : User Defined +arr2 : 005000 : 001001 : address : User Defined +arr : 005000 : 001001 : address : User Defined +x : 005000 : 001001 : integer : User Defined +arg : 005000 : 001001 : string : User Defined +-------------------------:--------:--------:--------------------------:------------------------------ diff --git a/tests/sprint3/test/sp3_boolean_binary_op_typecheck.alpha b/tests/sprint3/test/sp3_boolean_binary_op_typecheck.alpha index 5952129..538d982 100644 --- a/tests/sprint3/test/sp3_boolean_binary_op_typecheck.alpha +++ b/tests/sprint3/test/sp3_boolean_binary_op_typecheck.alpha @@ -1,6 +1,12 @@ -entry(arg) := { - [integer:x; address: arr; address: arr2; Boolean : b2; Boolean : b1] - b2 := 3 < x; - b1 := arr = 2; - b1 := 6<7 & arr2=7; +type main: string -> integer +function entry: main + +entry (arg) := { + [integer:x; address: arr; address: arr2; Boolean : b2; Boolean : b1] + + b2 := 3 < x; + b1 := arr = 2; + b1 := 6<7 & arr2=7; + + return 0; } diff --git a/tests/sprint3/test/sp3_boolean_unary_op_typecheck.alpha b/tests/sprint3/test/sp3_boolean_unary_op_typecheck.alpha index 12db768..6a23ff6 100644 --- a/tests/sprint3/test/sp3_boolean_unary_op_typecheck.alpha +++ b/tests/sprint3/test/sp3_boolean_unary_op_typecheck.alpha @@ -1,5 +1,11 @@ -entry(arg) := { - [integer:x; address: arr; address: arr2; Boolean : b2; Boolean : b1] - b2 := !(3 < 2); - b1 := !5; +type main: string -> integer +function entry: main + +entry (arg) := { + [integer:x; address: arr; address: arr2; Boolean : b2; Boolean : b1] + + b2 := !(3 < 2); + b1 := !5; + + return 0; } diff --git a/tests/sprint3/test/sp3_carls_second_mistake.alpha b/tests/sprint3/test/sp3_carls_second_mistake.alpha index 6d1d614..ddb58a4 100644 --- a/tests/sprint3/test/sp3_carls_second_mistake.alpha +++ b/tests/sprint3/test/sp3_carls_second_mistake.alpha @@ -1,10 +1,14 @@ +type main: string -> integer +function entry: main + type string: 1 -> character type a_of_s: 1 -> string (* maybe some other type definitions *) -entry(arg) := { +entry (arg) := { [ string: one_name; string: another_name; a_of_s: many_names ] + one_name := "a string literal"; another_name := reserve another_name(4); (* reserve space for an an array of character, with 4 members *) another_name(0) := 'C'; @@ -20,6 +24,7 @@ entry(arg) := { many_names(2)(2) := 'r'; many_names(2)(3) := 't'; many_names(2)(4) := 'h'; - 0(2)(5) := 'o'; + many_names(2)(5) := 'o'; + return 0; } \ No newline at end of file diff --git a/tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha b/tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha index 8d8ad70..bc88a72 100644 --- a/tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha +++ b/tests/sprint3/test/sp3_integer_binary_op_typecheck.alpha @@ -1,4 +1,5 @@ type main: string -> integer + type rec: [integer: x; integer: y] function entry: main diff --git a/tests/sprint3/test/sp3_integer_unary_op_typecheck.alpha b/tests/sprint3/test/sp3_integer_unary_op_typecheck.alpha index 31e01a7..7ab6817 100644 --- a/tests/sprint3/test/sp3_integer_unary_op_typecheck.alpha +++ b/tests/sprint3/test/sp3_integer_unary_op_typecheck.alpha @@ -1,6 +1,12 @@ -entry(arg) := { - [integer:x; address: arr; address: arr2; Boolean : b2; Boolean : b1] - x := -8; +type main: string -> integer +function entry: main + +entry (arg) := { + [integer:x; address: arr; address: arr2; Boolean : b2; Boolean : b1] + + x := -8; x := -b1; b2 := -x; + + return 0; }