diff --git a/README.MD b/README.MD index 525582f..74270bf 100644 --- a/README.MD +++ b/README.MD @@ -1,17 +1,83 @@ # The Translators α Compiler #### Members: Annie Slenker, Meyer Simon, Partho Bhattacharya, & Scarlett Kadan -## Lexical Analyzer -* **Undefined Behavior:** - * Spaces are not required between tokens. For instance, an INTEGER and an ID are valid even if there is no space between them +## Alpha Compiler Flags & Expected Results: +### -tok +Prints the token stream provided by the Lexical Analyzer to a `.tok` file. Output can be found in `/out/.tok`. Tokenization follows the specified format found in the alpha language spec. + +### -st +Prints the symbol table to a file. Follows the format provided in the alpha language spec. if the `-ir` flag is also present, the symbol table will print out temporary variables. Output can be found in `out/.st`. + +### -asc +Prints the annotated alpha source code to a file. Will display any syntax errors that are present below the line they occur on. If more than one error is present, the messages will stack. Output can be found in `out/.asc`. + +### -tc +Throws type check errors to the asc output file. If the `-asc` flag is not present, no errors will be displayed. Output can be found in `out/.asc` + +### -ir +Prints the intermediate code representation stream to a file. Output can be found in `out/.ir`. This flag modifies the `-st` flag, allowing for temporary variables to print out. + +### -cg +Prints the alpha program's unique x86 assembly to a `.s` file. Assembly stream is valid x86 code that can be assembled and linked with other .s files. Output can be found in `out/.s` + +### -debug +Prints debug messages to the console if present. Our debug messages utilizes a wrapper function for `printf()` called `printdebug()`. This allows for us to file names, code lines, and colors! + +### -help +Prints a general help message. (If you read this far, you probably won't need this flag) + + +## Alpha Tools: Testing & Building +We have built a few tools to aid in the development processes. These include `./test.sh` and `./genx.sh`. Below you can find information about each. + +### ./test.sh +All tests under sprint 1, 2, 3, & 4 will work with the testing suite, along with running it directly with the alpha executable. These files do not use the `#include` directive, instead opting to define everything used within the file. +> **Arguments:**
+> `-exp` Generate expected output files
+> `-diff` Compare output files with expected output files
+> `-help` Show this help message
+ +> **Usage:**
+> `./test.sh [flags]` Run the test on a single file
+> `./test.sh [flags]` Run the test on all files in a directory
+ +> **Examples:**
+> `./test.sh test.alpha` Runs test flags in header on test.alpha
+> `./test.sh test/` Runs test flags in header on all .alpha files in test/
+> `./test.sh test/ -exp` Runs test flags in header on all .alpha files in test/ and generates expected output files
+> `./test.sh test/ -diff` Runs test flags in header on all .alpha files in test/ and compares output files with expected output files
+> `./test.sh test/ -exp -diff` Runs test flags in header on all .alpha files in test/ and generates expected output files and compares output files with expected output files
+ +> **Notes:**
+> To create a test file, on the first line of the .alpha file, add:
+> `(* TEST: [ ] *)`
+> where are the alpha flags to be used. Ex:
+> `(* TEST: [ -debug -asc -tc ] *)`
+ +### ./genx.sh +GenX is our preprocessor tool. It is able to handle `#include` statements within an alpha file. The tool allows for includes of `.alpha`, `.s`, and `.c` files, given a relative path to them. You can also include our library file `std.alpha` which does not require a relative path.
+ +**NOTE:** *Due to the nature of include statements, running the alpha compiler on alpha files that use include statements will most likely result in syntax/type errors. When dealing with a file with include statements, it is advised to use GenX.*
+ +*You can also use the following command to preprocess a file:* `cpp -P -x c -o simple.cpp.alpha simple.alpha` + +> **Arguments:**
+> `-help` Displays this message
+ +> **Usage:**
+> `./genx.sh `
Generates executable file from
+ +> **Notes:**
+> Generates .s and links alpha driver and general library and other includes.
+ +## Other Notes: + +### Lexical Analyzer +**Undefined Behavior:**
+* Spaces are not required between tokens. For instance, an INTEGER and an ID are valid even if there is no space between them ``` Input: *5variable* Output: 2 14 301 "5" 1 1 101 "variable" ``` - -## Syntax Analyzer -* *Incomplete* - -## Symbol Table -* *TODO: Create diagram.* \ No newline at end of file +* Added an `#include` token to stop syntax errors from being reported on certain alpha files. \ No newline at end of file diff --git a/genx.sh b/genx.sh index 5bbb6f9..a1a9bd4 100755 --- a/genx.sh +++ b/genx.sh @@ -25,6 +25,8 @@ sToInclude=() cToBuild=() sToInclude+=("library/alpha_lib_reg.s") sToInclude+=("library/alpha_driver.s") +sToInclude+=("library/std.s") +sToInclude+=("library/boundscheck.s") filename="" s_name="" @@ -192,7 +194,7 @@ if [ $# -eq 1 ]; then getIncludes "$1" appendStr "$1" - ./alpha -ir -tc -asc -cg -st "$1" + ./alpha -ir -tc -asc -cg -st -tok "$1" # include a grep here of asc to see if there are any errors diff --git a/library/alphastdio.c b/library/alphastdio.c new file mode 100644 index 0000000..f4da2ce --- /dev/null +++ b/library/alphastdio.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include + + + +int printS(char *str) { + if (str == NULL) return -1; + printf("%s", str); + return 0; +} + +char *inS() { + char *buffer = malloc(100); + if (buffer == NULL) return NULL; + if (fgets(buffer, 100, stdin) == NULL) { + free(buffer); + return NULL; + } + buffer[strcspn(buffer, "\n")] = 0; + return buffer; +} + + + +int printI(int i) { + printf("%d", i); + return 0; +} + +int inI() { + int i; + char buffer[100]; + if (fgets(buffer, sizeof(buffer), stdin) == NULL) return 0; + if (sscanf(buffer, "%d", &i) != 1) return 0; + return i; +} + + + +int printC(char c) { + printf("%c", c); + return 0; +} + +char inC() { + char c; + if (scanf(" %c", &c) != 1) return 0; + return c; +} + + + +int printB(bool b) { + if (b) + printf("true"); + else + printf("false"); + return 0; +} \ No newline at end of file diff --git a/library/boundscheck.c b/library/boundscheck.c new file mode 100644 index 0000000..5e6081c --- /dev/null +++ b/library/boundscheck.c @@ -0,0 +1,23 @@ +#include +#include +#include + +int BoundsError(int d){ + printf("You are trying to access memory that isn't yours.\n"); + exit(1); +} + +void BoundsCheck(int argc, void * start, ...){ + va_list argptr; + va_start(argptr, start); + int index = 0; + while (argc){ + argc--; + index = va_arg(argptr, int); + if(index > *(int*)start){ + BoundsError(index); + } + start += sizeof(int); + } + va_end(argptr); +} \ No newline at end of file diff --git a/library/boundscheck.s b/library/boundscheck.s new file mode 100644 index 0000000..36fa414 --- /dev/null +++ b/library/boundscheck.s @@ -0,0 +1,112 @@ + .file "boundscheck.c" + .text + .section .rodata + .align 8 +.LC0: + .string "You are trying to access memory that isn't yours." + .text + .globl BoundsError + .type BoundsError, @function +BoundsError: +.LFB6: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + subq $16, %rsp + movl %edi, -4(%rbp) + leaq .LC0(%rip), %rax + movq %rax, %rdi + call puts@PLT + movl $1, %edi + call exit@PLT + .cfi_endproc +.LFE6: + .size BoundsError, .-BoundsError + .globl BoundsCheck + .type BoundsCheck, @function +BoundsCheck: +.LFB7: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + subq $240, %rsp + movl %edi, -228(%rbp) + movq %rsi, -240(%rbp) + movq %rdx, -160(%rbp) + movq %rcx, -152(%rbp) + movq %r8, -144(%rbp) + movq %r9, -136(%rbp) + testb %al, %al + je .L3 + movaps %xmm0, -128(%rbp) + movaps %xmm1, -112(%rbp) + movaps %xmm2, -96(%rbp) + movaps %xmm3, -80(%rbp) + movaps %xmm4, -64(%rbp) + movaps %xmm5, -48(%rbp) + movaps %xmm6, -32(%rbp) + movaps %xmm7, -16(%rbp) +.L3: + movq %fs:40, %rax + movq %rax, -184(%rbp) + xorl %eax, %eax + movl $16, -208(%rbp) + movl $48, -204(%rbp) + leaq 16(%rbp), %rax + movq %rax, -200(%rbp) + leaq -176(%rbp), %rax + movq %rax, -192(%rbp) + movl $0, -212(%rbp) + jmp .L4 +.L8: + subl $1, -228(%rbp) + movl -208(%rbp), %eax + cmpl $47, %eax + ja .L5 + movq -192(%rbp), %rax + movl -208(%rbp), %edx + movl %edx, %edx + addq %rdx, %rax + movl -208(%rbp), %edx + addl $8, %edx + movl %edx, -208(%rbp) + jmp .L6 +.L5: + movq -200(%rbp), %rax + leaq 8(%rax), %rdx + movq %rdx, -200(%rbp) +.L6: + movl (%rax), %eax + movl %eax, -212(%rbp) + movq -240(%rbp), %rax + movl (%rax), %eax + cmpl %eax, -212(%rbp) + jle .L7 + movl -212(%rbp), %eax + movl %eax, %edi + call BoundsError +.L7: + addq $4, -240(%rbp) +.L4: + cmpl $0, -228(%rbp) + jne .L8 + nop + movq -184(%rbp), %rax + subq %fs:40, %rax + je .L9 + call __stack_chk_fail@PLT +.L9: + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE7: + .size BoundsCheck, .-BoundsCheck + .ident "GCC: (GNU) 14.2.1 20250207" + .section .note.GNU-stack,"",@progbits diff --git a/library/std.alpha b/library/std.alpha index a2fc025..19b278a 100644 --- a/library/std.alpha +++ b/library/std.alpha @@ -1,4 +1,4 @@ -(* Standard Alpha Library - Provided by Carl *) +(* Standard Alpha Library *) type string: 1 -> character type BooleanXBoolean: [Boolean: x; Boolean: y] @@ -16,9 +16,20 @@ type characterXcharacter2Boolean: characterXcharacter -> Boolean type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean type integer2address: integer -> address type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + external function printInteger: integer2integer external function printCharacter: character2integer external function printBoolean: Boolean2integer -function entry: string2integer +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character diff --git a/library/std.s b/library/std.s new file mode 100644 index 0000000..6cdcb90 --- /dev/null +++ b/library/std.s @@ -0,0 +1,273 @@ + .file "alphastdio.c" + .text + .section .rodata +.LC0: + .string "%s" + .text + .globl printS + .type printS, @function +printS: +.LFB6: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + subq $16, %rsp + movq %rdi, -8(%rbp) + cmpq $0, -8(%rbp) + jne .L2 + movl $-1, %eax + jmp .L3 +.L2: + movq -8(%rbp), %rax + movq %rax, %rsi + leaq .LC0(%rip), %rax + movq %rax, %rdi + movl $0, %eax + call printf@PLT + movl $0, %eax +.L3: + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE6: + .size printS, .-printS + .section .rodata +.LC1: + .string "\n" + .text + .globl inS + .type inS, @function +inS: +.LFB7: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + subq $16, %rsp + movl $100, %edi + call malloc@PLT + movq %rax, -8(%rbp) + cmpq $0, -8(%rbp) + jne .L5 + movl $0, %eax + jmp .L6 +.L5: + movq stdin(%rip), %rdx + movq -8(%rbp), %rax + movl $100, %esi + movq %rax, %rdi + call fgets@PLT + testq %rax, %rax + jne .L7 + movq -8(%rbp), %rax + movq %rax, %rdi + call free@PLT + movl $0, %eax + jmp .L6 +.L7: + movq -8(%rbp), %rax + leaq .LC1(%rip), %rdx + movq %rdx, %rsi + movq %rax, %rdi + call strcspn@PLT + movq -8(%rbp), %rdx + addq %rdx, %rax + movb $0, (%rax) + movq -8(%rbp), %rax +.L6: + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE7: + .size inS, .-inS + .section .rodata +.LC2: + .string "%d" + .text + .globl printI + .type printI, @function +printI: +.LFB8: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + subq $16, %rsp + movl %edi, -4(%rbp) + movl -4(%rbp), %eax + movl %eax, %esi + leaq .LC2(%rip), %rax + movq %rax, %rdi + movl $0, %eax + call printf@PLT + movl $0, %eax + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE8: + .size printI, .-printI + .globl inI + .type inI, @function +inI: +.LFB9: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + addq $-128, %rsp + movq %fs:40, %rax + movq %rax, -8(%rbp) + xorl %eax, %eax + movq stdin(%rip), %rdx + leaq -112(%rbp), %rax + movl $100, %esi + movq %rax, %rdi + call fgets@PLT + testq %rax, %rax + jne .L11 + movl $0, %eax + jmp .L14 +.L11: + leaq -116(%rbp), %rdx + leaq -112(%rbp), %rax + leaq .LC2(%rip), %rcx + movq %rcx, %rsi + movq %rax, %rdi + movl $0, %eax + call __isoc99_sscanf@PLT + cmpl $1, %eax + je .L13 + movl $0, %eax + jmp .L14 +.L13: + movl -116(%rbp), %eax +.L14: + movq -8(%rbp), %rdx + subq %fs:40, %rdx + je .L15 + call __stack_chk_fail@PLT +.L15: + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE9: + .size inI, .-inI + .globl printC + .type printC, @function +printC: +.LFB10: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + subq $16, %rsp + movl %edi, %eax + movb %al, -4(%rbp) + movsbl -4(%rbp), %eax + movl %eax, %edi + call putchar@PLT + movl $0, %eax + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE10: + .size printC, .-printC + .section .rodata +.LC3: + .string " %c" + .text + .globl inC + .type inC, @function +inC: +.LFB11: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + subq $16, %rsp + movq %fs:40, %rax + movq %rax, -8(%rbp) + xorl %eax, %eax + leaq -9(%rbp), %rax + movq %rax, %rsi + leaq .LC3(%rip), %rax + movq %rax, %rdi + movl $0, %eax + call __isoc99_scanf@PLT + cmpl $1, %eax + je .L19 + movl $0, %eax + jmp .L21 +.L19: + movzbl -9(%rbp), %eax +.L21: + movq -8(%rbp), %rdx + subq %fs:40, %rdx + je .L22 + call __stack_chk_fail@PLT +.L22: + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE11: + .size inC, .-inC + .section .rodata +.LC4: + .string "true" +.LC5: + .string "false" + .text + .globl printB + .type printB, @function +printB: +.LFB12: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + subq $16, %rsp + movl %edi, %eax + movb %al, -4(%rbp) + cmpb $0, -4(%rbp) + je .L24 + leaq .LC4(%rip), %rax + movq %rax, %rdi + movl $0, %eax + call printf@PLT + jmp .L25 +.L24: + leaq .LC5(%rip), %rax + movq %rax, %rdi + movl $0, %eax + call printf@PLT +.L25: + movl $0, %eax + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE12: + .size printB, .-printB + .ident "GCC: (GNU) 14.2.1 20250207" + .section .note.GNU-stack,"",@progbits diff --git a/src/codegen.c b/src/codegen.c index 492d3df..44d39df 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -3,92 +3,112 @@ #include "codegen.h" int paramCount = 0; +int funDec = 0; int generate() { offset = 0; currentsp = 0; Instruction *i = begin; - + funList = NULL; // temporary fprintf(cg_flag, ".globl entry\n"); while (i != NULL) { switch (getOp(i)) { - case E_LABEL: - generateLabel(i); - break; - case E_ADD: - generateAdd(i); - break; - case E_SUB: - generateSub(i); - break; - case E_MUL: - generateMult(i); - break; - case E_DIV: - generateDiv(i); - break; - case E_MOD: - generateMod(i); - break; - case E_OR: - generateOr(i); - break; - case E_AND: - generateAnd(i); - break; - case E_NEG: - generateNeg(i); - break; - case E_NOT: - generateNot(i); - break; - case E_ASSIGN: - generateAssign(i); - break; - case E_GOTO: - generateGoto(i); - break; - case E_IF_X_TRUE: - generateIfTrue(i); - break; - case E_IF_X_FALSE: - generateIfFalse(i); - break; - case E_LESS_THAN: - generateLessThan(i); - break; - case E_EQUAL_TO: - generateEqualTo(i); - break; - case E_CALL: - generateCall(i); - break; - case E_PARAM: - generateParam(i); - break; - case E_RETURN: - generateReturn(i); - break; - case E_INDEX_COPY_RIGHT: - generateCopyRight(i); - break; - case E_INDEX_COPY_LEFT: - generateCopyLeft(i); - break; - case E_ADDRESS_OF: - generateAddressOf(i); - break; - case E_FUNC_START: - generateFunctionStart(i); - break; - default:; + case E_LABEL: + generateLabel(i); + break; + case E_ADD: + generateAdd(i); + break; + case E_SUB: + generateSub(i); + break; + case E_MUL: + generateMult(i); + break; + case E_DIV: + generateDiv(i); + break; + case E_MOD: + generateMod(i); + break; + case E_OR: + generateOr(i); + break; + case E_AND: + generateAnd(i); + break; + case E_NEG: + generateNeg(i); + break; + case E_NOT: + generateNot(i); + break; + case E_ASSIGN: + generateAssign(i); + break; + case E_GOTO: + generateGoto(i); + break; + case E_IF_X_TRUE: + generateIfTrue(i); + break; + case E_IF_X_FALSE: + generateIfFalse(i); + break; + case E_LESS_THAN: + generateLessThan(i); + break; + case E_EQUAL_TO: + generateEqualTo(i); + break; + case E_CALL: + generateCall(i); + break; + case E_PARAM: + generateParam(i); + break; + case E_RETURN: + generateReturn(i); + break; + case E_INDEX_COPY_RIGHT: + generateCopyRight(i); + break; + case E_INDEX_COPY_LEFT: + generateCopyLeft(i); + break; + case E_ADDRESS_OF: + generateAddressOf(i); + break; + case E_FUNC_START: + generateFunctionStart(i); + break; + case E_FUNC_DEC: + generateFunctionDec(i); + break; + default:; } i = i->next; } return -1; } +bool isAnActualFunction(TableNode *tn) { + FunDecList *fdl = funList; + while (fdl != NULL) { + printf("%s %s, %s %s\n", getName(fdl->tn), getType(fdl->tn), getName(tn), getType(tn)); + if (tn == fdl->tn) { + return true; + } + fdl = fdl ->next; + } + return false; +} + +void align(TableNode *tn) { + int size = getPrimSize(getTypeEntry(tn)); + offset += offset % size; +} CGNode *getNextCG(CGNode *cg) { if (cg == NULL) { return NULL; @@ -125,6 +145,7 @@ CGNode *findCG(TableNode *tn) { CGNode *addCG(TableNode *tn, int sp) { CGNode *cg = calloc(1, sizeof(CGNode)); cg->tn = tn; + align(tn); offset += getPrimSize(getTypeEntry(tn)); cg->address = offset; cg->next = cgList; @@ -132,6 +153,16 @@ CGNode *addCG(TableNode *tn, int sp) { return cg; } +int generateFunctionDec(Instruction *i) { + FunDecList * fd = calloc(1, sizeof(FunDecList)); + CGNode *cg = addCG(getResult(i),offset); +// printf("%d\n", getAddress(cg)+currentsp); + offset += 8; + fd->tn = getResult(i); + fd->next = funList; + funList = fd; + return 0; +} int generateLabel(Instruction *inst) { if (inst == NULL) { return -1; @@ -358,10 +389,10 @@ int generateOr(Instruction *inst) { int label = label_gen(); - fprintf(cg_flag, "\tcmpl\t$0, %d(%%rbp)\t#start or\n", getAddress(op1CG)); + fprintf(cg_flag, "\tcmpb\t$0, %d(%%rbp)\t#start or\n", getAddress(op1CG)); fprintf(cg_flag, "\tjne\t.L%dor2\n", label); - fprintf(cg_flag, "\tcmpl\t$0, %d(%%rbp)\n", getAddress(op2CG)); + fprintf(cg_flag, "\tcmpb\t$0, %d(%%rbp)\n", getAddress(op2CG)); fprintf(cg_flag, "\tje\t.L%dor3\n", label); fprintf(cg_flag, ".L%dor2:\n", label); @@ -409,10 +440,10 @@ int generateAnd(Instruction *inst) { } int label = label_gen(); - fprintf(cg_flag, "\tcmpl\t$0, %d(%%rbp)\t#start and\n", getAddress(op1CG)); + fprintf(cg_flag, "\tcmpb\t$0, %d(%%rbp)\t#start and\n", getAddress(op1CG)); fprintf(cg_flag, "\tje\t.L%dor2\n", label); - fprintf(cg_flag, "\tcmpl\t$0, %d(%%rbp)\n", getAddress(op2CG)); + fprintf(cg_flag, "\tcmpb\t$0, %d(%%rbp)\n", getAddress(op2CG)); fprintf(cg_flag, "\tje\t.L%dor2\n", label); fprintf(cg_flag, "\tmovl\t$1, %%eax\n"); @@ -504,14 +535,35 @@ int generateAssign(Instruction *inst) { printdebug("generateAssign failed, %s is not constant but not in CGlist", getName(getTN(op1))); return -1; } - - fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#assign start\n", getAddress(op1CG)); - fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#assign end\n", getAddress(cg)); + if (getAdInfoType(getTN(op1)) != TYPE_FUNCTION_DECLARATION || table_lookup(getAncestor(cur), getName(getTN(op1))) == undefined){ + char *movtype; + char *reg; + TableNode *typetn = getTypeEntry(getTN(op1)); + if (typetn == integ) { + movtype = "movl"; + reg = "%eax"; + } else if (typetn == boo) { + movtype = "movb"; + reg = "%al"; + } else if (typetn == chara) { + movtype = "movb"; + reg = "%al"; + } else { + movtype = "movq"; + reg = "%rax"; + } + fprintf(cg_flag, "\t%s\t%d(%%rbp), %s\t#assign start\n",movtype, getAddress(op1CG), reg); + fprintf(cg_flag, "\t%s\t%s, %d(%%rbp)\t#assign end\n", movtype,reg,getAddress(cg)); + } else { + fprintf(cg_flag, "\tmovl\t$%s,%%eax\t#assign function\n", getName(getTN(op1))); + fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#assign function end\n", getAddress(cg)); + } return 0; } int generateGoto(Instruction *inst) { - return -1; + fprintf(cg_flag, "\tjmp\t.L%d\n", getLabel(inst)); + return 0; } int generateCondGoto(Instruction *inst) { @@ -519,12 +571,39 @@ int generateCondGoto(Instruction *inst) { } int generateIfTrue(Instruction *inst) { - return -1; - // might just be a goto for where to go if something is true, or returning if something is true, or checking if true and writing goto if thats the case + TNodeOrConst *op1 = getOperand1(inst); + + if (op1 == NULL) { + printdebug("%sgenerateIfTrue failed, NULL operand", COLOR_RED); + return -1; + } + + CGNode *cg = findCG(getTN(op1)); + if (cg == NULL) { + printdebug("generateIfTrue failed, operand not on stack"); + return -1; + } + + fprintf(cg_flag, "\tcmpb\t$0, %d(%%rbp)\t#if true start\n", getAddress(cg)); + fprintf(cg_flag, "\tjne\t.L%d\t\t#if true end\n", getLabel(inst)); } int generateIfFalse(Instruction *inst) { - return -1; + TNodeOrConst *op1 = getOperand1(inst); + + if (op1 == NULL) { + printdebug("%sgenerateIfFalse failed, NULL operand", COLOR_RED); + return -1; + } + + CGNode *cg = findCG(getTN(op1)); + if (cg == NULL) { + printdebug("generateIfFalse failed, operand not on stack"); + return -1; + } + + fprintf(cg_flag, "\tcmpl\t$0, %d(%%rbp)\t#if false start\n", getAddress(cg)); + fprintf(cg_flag, "\tje\t.L%d\t\t#if false end\n", getLabel(inst)); } int generateLessThan(Instruction *inst) { @@ -599,6 +678,7 @@ int generateEqualTo(Instruction *inst) { fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#equal to start\n", getAddress(op1CG)); fprintf(cg_flag, "\tcmpl\t%d(%%rbp), %%eax\n", getAddress(op2CG)); fprintf(cg_flag, "\tsete\t%%al\n"); + fprintf(cg_flag, "\tmovb\t$0, %d(%%rbp)\n", getAddress(cg)); fprintf(cg_flag, "\tmovb\t%%al, %d(%%rbp)\t#equal to end\n", getAddress(cg)); return 0; } @@ -621,16 +701,24 @@ int generateCall(Instruction *inst) { return -1; } - // if (getTN(op2) == NULL) { - // printdebug("generateFunctionCall failed, NULL tablenode2"); - // return -1; - //} - - fprintf(cg_flag, "\tcall %s\n", getName(getTN(op1))); - + if (table_lookup(getAncestor(cur),getName(getTN(op1)))!=undefined) { + fprintf(cg_flag, "\tcall %s\n", getName(getTN(op1))); + } else { + // printf("%s\n", getName(getTN(op1))); + if (findCG(getTN(op1)) == NULL) { + //printf("generateFunctionCall failed, function not in stack"); + return -1; + } + fprintf(cg_flag, "\tmovq\t%d(%%rbp), %%rax\t#call %s!\n", getAddress(findCG(getTN(op1))), getName(getTN(op1))); + fprintf(cg_flag, "\tcall *%%rax\n"); + } + //if (getTN(op2) == NULL) { + //printdebug("generateFunctionCall failed, NULL tablenode2"); + // return -1; + // } //now for the return CGNode *cg = findCG(getResult(inst)); - + if (cg == NULL) { cg = addCG(getResult(inst), offset); } @@ -653,8 +741,11 @@ int generateReturn(Instruction *inst) { printdebug("generateReturn failed, trying to return %s not in CGList", getName(getTN(op1))); return -1; } - - fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#return %s\n", getAddress(cg), getName(getTN(op1))); + if (table_lookup(getAncestor(cur), getName(getTN(op1))) != undefined) { + fprintf(cg_flag, "\tmovl\t$%s,%%eax\t#return a function\n", getName(getTN(op1))); + } else { + fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#return %s\n", getAddress(cg), getName(getTN(op1))); + } fprintf(cg_flag, "\tleave\n"); fprintf(cg_flag, "\tret\n"); return 0; @@ -671,7 +762,7 @@ int generateAddressOf(Instruction *inst) { int generateParam(Instruction *inst) { TNodeOrConst *op1 = getOperand1(inst); - fprintf(stderr, "generate param reached\n"); + //fprintf(stderr, "generate param reached\n"); if (op1 == NULL) { printdebug("generateParam failed, NULL operand"); return -1; @@ -703,6 +794,7 @@ int generateParam(Instruction *inst) { fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG6); break; default: + align(getTN(op1)); offset += getPrimSize(getTypeEntry(getTN(op1))); fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#adding param start\n", getAddress(op1CG)); fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#adding param end\n", offset - getPrimSize(getTypeEntry(getTN(op1)))); @@ -723,7 +815,7 @@ int generateFunctionStart(Instruction *inst) { fprintf(cg_flag, "%s:\n", getName(funDecTN)); fprintf(cg_flag, "\tpushq\t%%rbp\n"); fprintf(cg_flag, "\tmovq\t%%rsp, %%rbp\n"); - fprintf(cg_flag, "\tsubq\t$%d, %%rsp\n", 128); // [CHANGE ME] 128 is a placeholder for the stack size + fprintf(cg_flag, "\tsubq\t$%d, %%rsp\n", getStackSize()); //now we need to add the CGs of nodes to the CG list by doing assign from the // have function declararation node @@ -737,7 +829,8 @@ int generateFunctionStart(Instruction *inst) { TableNode *tnToAdd = getFirstEntry(st); if (getAdInfoType(paramTN) != TYPE_RECORD_TYPE) { CGNode *paramCG = addCG(tnToAdd, offset); - paramOffset += getPrimSize(tnToAdd); + int size = getPrimSize(getTypeEntry(tnToAdd)); + paramOffset += getPrimSize(getTypeEntry(tnToAdd)); fprintf(cg_flag, "\tmovl\t%%edi, %d(%%rbp)\t#FunctionStart1param end\n", getAddress(paramCG)); } else { int numParams = getRecLength(paramTN); @@ -763,7 +856,8 @@ int generateFunctionStart(Instruction *inst) { fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG6, getAddress(paramCG)); break; default: - paramOffset += getPrimSize(getTypeEntry(tnToAdd)); + int size = getPrimSize(getTypeEntry(tnToAdd)); + paramOffset += size; offset += getPrimSize(getTypeEntry(tnToAdd)); fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#FunctionStart1Param start\n", paramOffset); fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#FunctionStart1param end\n", getAddress(paramCG)); @@ -774,5 +868,17 @@ int generateFunctionStart(Instruction *inst) { } } +/* if (strcmp(getName(funDecTN), "entry") == 0) { + if (funList == NULL) { + return -1; + } + TableNode *funDec; + while (funList != NULL) { + funDec = funList->tn; + CGNode *cg = findCG(getResult(inst)); + fprintf(cg_flag, "\tmovq\t$%s, %d(%%rbp)\t#storing function declaration\n", getName(funDec), getAddress(cg)); + funList = funList->next; + } + } */ return 0; } diff --git a/src/codegen.h b/src/codegen.h index bf1d7cd..828f16a 100644 --- a/src/codegen.h +++ b/src/codegen.h @@ -25,15 +25,22 @@ extern FILE *cg_flag; typedef struct CGNode { TableNode *tn; int address; - CGNode *next; + struct CGNode *next; } CGNode; +typedef struct FunDecList { + TableNode *tn; + struct FunDecList *next; +} FunDecList; + +bool isAnActualFunction(TableNode *tn); int generate(); CGNode *getNextCG(CGNode *cg); int getAddress(CGNode *cg); TableNode *getTNofCG(CGNode *cg); CGNode *findCG(TableNode *tn); CGNode *addCG(TableNode *tn, int sp); +int generateFunctionDec(Instruction *inst); int generateLabel(Instruction *inst); int generateAdd(Instruction *inst); int generateSub(Instruction *instruction); @@ -62,7 +69,9 @@ int generateFunctionStart(Instruction *instruction); extern int label_count; extern Instruction *begin; extern Instruction *current; +extern SymbolTable *top; extern int offset; extern int currentsp; extern CGNode *cgList; +extern FunDecList *funList; diff --git a/src/grammar.h b/src/grammar.h index 2ad23b8..43272b7 100644 --- a/src/grammar.h +++ b/src/grammar.h @@ -33,7 +33,7 @@ Instruction *current; int offset; int currentsp; CGNode *cgList; - +FunDecList *funList; Stack *stack; Stack *TrueList; Stack *FalseList; diff --git a/src/grammar.y b/src/grammar.y index 78f5aa2..fa74029 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -613,6 +613,9 @@ compound_statement: emit_label(*l); S_Push(stack, l, 2); } expression R_PAREN { + emit_conditional_jump(E_IF_X_FALSE, 0, tn_or_const(NODE, $4)); + Stack * t = S_Peek(FalseList); + S_Push(t, current, 1); emit_label(label_gen()); emit_backpatch(S_Pop(TrueList), getLabel(current)); } sblock { @@ -622,6 +625,7 @@ compound_statement: emit_goto(*(int*)(S_Pop(stack))); emit_label(l); } + // IF L_PAREN expression R_PAREN THEN sblock ELSE sblock | IF L_PAREN { S_Push(TrueList, S_Init(), 0); S_Push(FalseList, S_Init(), 0); @@ -690,7 +694,9 @@ simple_statement: } ASSIGN expression { // ---------------------------------------------------------------------------- - emit_label(label_gen()); + if ( getTypeEntry((TableNode*)$4) == boo ) { + emit_label(label_gen()); + } emit_backpatch(S_Pop(TrueList), getLabel(current)); emit_backpatch(S_Pop(FalseList), getLabel(current)); // ---------------------------------------------------------------------------- @@ -949,8 +955,8 @@ expression: // ---------------------------------------------------------------------------- uint_least8_t b = 0; emit_assignment(node, tn_or_const(BOOLEAN,&b)); - emit_label(label_gen()); - emit_backpatch(S_Pop(TrueList), getLabel(current)); + // emit_label(label_gen()); + // emit_backpatch(S_Pop(TrueList), getLabel(current)); emit_conditional_jump(E_IF_X_FALSE, 0, tn_or_const(NODE, $1)); Stack * t1 = S_Peek(FalseList); if(t1==NULL){ @@ -1002,8 +1008,8 @@ expression: // ---------------------------------------------------------------------------- uint_least8_t b = 1; emit_assignment(node, tn_or_const(BOOLEAN,&b)); - emit_label(label_gen()); - emit_backpatch(S_Pop(TrueList), getLabel(current)); + // emit_label(label_gen()); + // emit_backpatch(S_Pop(TrueList), getLabel(current)); emit_conditional_jump(E_IF_X_TRUE, 0, tn_or_const(NODE, $1)); Stack * t1 = S_Peek(TrueList); if(t1==NULL){ @@ -1055,7 +1061,6 @@ expression: // emit_label(label_gen()); // emit_backpatch(S_Pop(TrueList), getLabel(current)); emit_binary_op(E_LESS_THAN, node, tn_or_const(NODE,$1), tn_or_const(NODE,$3)); - /* emit_conditional_jump(E_IF_X_TRUE, 0, tn_or_const(NODE, node)); Stack * t = S_Peek(TrueList); if(t==NULL){ @@ -1070,6 +1075,7 @@ expression: S_Push(FalseList, t, 1); } S_Push(t, current, 1); + /* */ // ---------------------------------------------------------------------------- printdebug("less than expression"); @@ -1089,7 +1095,6 @@ expression: TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, boo, temp, NULL); // ---------------------------------------------------------------------------- emit_binary_op(E_EQUAL_TO, node, tn_or_const(NODE,$1), tn_or_const(NODE,$3)); - /* emit_conditional_jump(E_IF_X_TRUE, 0, tn_or_const(NODE, node)); Stack * t = S_Peek(TrueList); if(t==NULL){ @@ -1104,6 +1109,7 @@ expression: S_Push(FalseList, t, 1); } S_Push(t, current, 1); + /* */ // emit_label(label_gen()); // emit_backpatch(S_Pop(TrueList), getLabel(current)); @@ -1494,8 +1500,10 @@ assignable: TableNode* node = CreateEntry(cur,t, type, temp, NULL); // getElementOffset(rec, ID) - //NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK) - //emit_field_access(char* node, char* record, $3) + // NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK) + // emit_field_access(char* node, char* record, $3) + int n = getElementOffset(getTypeEntry((TableNode*)$1), $3); + emit_field_access(node, tn_or_const(NODE, $1), n); $$=node; }else{ throw_error(ERROR_TYPE, "Invalid field access %s", $3); @@ -1503,8 +1511,6 @@ assignable: } printdebug("[ASSIGNABLE - RULE 3] record = name: %s | field = %s", getName((TableNode*)($1)), getName((TableNode*)$3)); } - - ; diff --git a/src/intermediate_code.h b/src/intermediate_code.h index 87e3123..67c6346 100644 --- a/src/intermediate_code.h +++ b/src/intermediate_code.h @@ -49,7 +49,7 @@ typedef enum { // these are from page 364 E_SUB, // 1 E_MUL, // 1 E_DIV, // 1 - E_MOD, // 1 TODO: Please change to REM + E_MOD, // 1 E_OR, // 1 E_AND, // 1 E_NEG, // 2 diff --git a/src/lexicalStructure.lex b/src/lexicalStructure.lex index a8bd8af..a8f4474 100644 --- a/src/lexicalStructure.lex +++ b/src/lexicalStructure.lex @@ -58,7 +58,24 @@ SCHAR \\n|\\t|\\\"|[^\"\n\\] "->" { if(tok_flag != NULL) {print_tok(ARROW);} incr(line_number,column_number,ARROW); return ARROW; } {DIGIT}+ {if(tok_flag != NULL){print_tok(C_INTEGER);}incr(line_number,column_number,C_INTEGER);yylval.integ = atoi(yytext)/*words = strdup("integer")*/;return C_INTEGER;} -'{CHAR}' {if(tok_flag != NULL){print_tok(C_CHARACTER);}incr(line_number,column_number,C_CHARACTER);char* token = strdup(yytext)/*yylval.tn = chara*/;yylval.letter = token[1];return C_CHARACTER;} + + +'{CHAR}' { + if (tok_flag) print_tok(C_CHARACTER); + incr(line_number, column_number, C_CHARACTER); + + int value; + if (strcmp(yytext, "'\\n'") == 0) value = 0x0A; + else if (strcmp(yytext, "'\\t'") == 0) value = 0x09; + else if (strcmp(yytext, "'\\''") == 0) value = 0x27; + else if (strcmp(yytext, "'\\\\'") == 0) value = 0x5C; + else value = yytext[1]; + + yylval.letter = value; + return C_CHARACTER; +} + + \"{SCHAR}*\" {if(tok_flag != NULL){print_tok(C_STRING);}incr(line_number,column_number,C_STRING);int k = strlen(yytext);yytext[k-1] = '\0';yylval.words = strdup(&yytext[1]);return C_STRING;} {COMMENT} {if(tok_flag != NULL){print_tok(COMMENT);}incr(line_number,column_number,COMMENT);/*return COMMENT;*/} _{DIGIT}+ {if(tok_flag != NULL){print_tok(ACCESS);}incr(line_number,column_number,ACCESS);yylval.integ = atoi(&yytext[1])/*words = strdup("integer")*/;return ACCESS;} @@ -80,4 +97,4 @@ _{DIGIT}+ {if(tok_flag != NULL){print_tok(ACCESS);}incr(line_number,colum " " { incr(line_number,column_number,0); } . { incr(line_number,column_number,0); } -%% +%% \ No newline at end of file diff --git a/src/symbol_table.c b/src/symbol_table.c index d63f23e..bdf0c08 100644 --- a/src/symbol_table.c +++ b/src/symbol_table.c @@ -694,7 +694,7 @@ int getRecSize(SymbolTable *tn) { } return -1; } -int getRecPosition(TableNode* rec, char* id){ +int getRecPosition(TableNode *rec, char *id) { if (rec == NULL) { printdebug( "passed a NULL entry to getRecPosition. Invalid."); @@ -710,25 +710,25 @@ int getRecPosition(TableNode* rec, char* id){ "not checking the position of a record -- invalid op"); return -1; } - TableNode* cur = getFirstEntry(getRecList(rec)); + TableNode *cur = getFirstEntry(getRecList(rec)); int i = 1; - while(cur != NULL){ - if(strcmp(getName(cur), id) == 0){ + while (cur != NULL) { + if (strcmp(getName(cur), id) == 0) { return i; } cur = getNextEntry(cur); i++; } - if (cur == NULL){ + if (cur == NULL) { printdebug( "passed an invalid entry to getRecPosition. Invalid."); return -1; - }else{ - return i; + } else { + return i; } } -int getElementOffset(TableNode *rec, char* id) { +int getElementOffset(TableNode *rec, char *id) { if (rec == NULL) { printdebug( "passed a NULL entry to getElementOffset. Invalid."); @@ -744,7 +744,7 @@ int getElementOffset(TableNode *rec, char* id) { "not checking the offset of a record -- invalid op"); return -1; } - int* offsets = getRecOffsets(rec); + int *offsets = getRecOffsets(rec); int position = getRecPosition(rec, id); if (position == -1) { printdebug( @@ -754,11 +754,11 @@ int getElementOffset(TableNode *rec, char* id) { position = position - 1; int total_offset = 0; int current_position = 1; - while(current_position < position+1){ + while (current_position < position + 1) { //adding current element in struct - total_offset += offsets[2*current_position]; + total_offset += offsets[2 * current_position]; //adding padding between elements - total_offset += offsets[2*current_position+1]; + total_offset += offsets[2 * current_position + 1]; current_position++; } //returning the offset of the start of the element @@ -1721,7 +1721,7 @@ void print_symbol_table(SymbolTable *table, FILE *file_ptr) { if ((getFirstChild(node)) == NULL) { print_symbol_table(getFirstChild(node), file_ptr); } else { - if (getLine(getFirstChild(node)) < 0) { + if (getLine(getFirstChild(node)) < -3) { continue; } else { print_symbol_table(getFirstChild(node), file_ptr); @@ -1971,3 +1971,28 @@ TableNode *printTableNode(TableNode *tn) { return tn; } + +int getStackSize() { + int i = 0; + TableNode *tn = getFirstEntry(top); + while (tn != NULL) { + i++; + tn = getNextEntry(tn); + } + + ListOfTable *lt = getChildren(top); + while (lt != NULL) { + TableNode *first = lt->table->entries; + while (first != NULL) { + i++; + first = getNextEntry(first); + } + + lt = lt->next; + } + + i= i * 8; + if (i % 16 != 0) i += 8; + + return i; +} diff --git a/src/symbol_table.h b/src/symbol_table.h index 82ab464..35d6b81 100644 --- a/src/symbol_table.h +++ b/src/symbol_table.h @@ -203,13 +203,20 @@ ListOfTable *getRestOfChildren(ListOfTable *lt); TableNode *getFirstEntry(SymbolTable *st); TableNode *getNextEntry(TableNode *tn); TableNode *printTableNode(TableNode *tn); + TableNode *getContextTypeEntry(Context_stack *cs); +int getElementOffset(TableNode *rec, char* id); +int getRecPosition(TableNode* rec, char* id); +int getStackSize(); + + extern int yylex(void); extern char *yytext; extern int yyleng; extern int yychar; extern SymbolTable *cur; +extern SymbolTable *top; extern int line_number; extern int column_number; extern FILE *yyin; @@ -244,4 +251,4 @@ 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 +extern char *COLOR_WHITE; diff --git a/tests/given/README.MD b/tests/given/README.MD new file mode 100644 index 0000000..ad2dae4 --- /dev/null +++ b/tests/given/README.MD @@ -0,0 +1 @@ +NOTE: slightly modified from originals, please execute with care. :) \ No newline at end of file diff --git a/tests/given/test/functionValue.alpha b/tests/given/test/functionValue.alpha index 8216d9e..24fce40 100644 --- a/tests/given/test/functionValue.alpha +++ b/tests/given/test/functionValue.alpha @@ -1,6 +1,6 @@ (* TEST: [-asc -tc] *) (* Type definitions *) - +#include "std.alpha" (* mapping type *) type string2int: string -> integer @@ -9,9 +9,9 @@ type funArray: 1 -> string2int (* record of functions *) type funRec: [ string2int: f; string2int: g ] - +type int2int: integer -> integer (* function returning function *) -type integer_2_string2int: integer -> string2int +type integer_2_int2int: integer -> int2int (* function returning function *) type string2int_2_integer: string2int -> integer @@ -22,22 +22,23 @@ type iXiXc: [integer: a; integer: b; character: c] type iic2b: iXiXc -> Boolean (* Function declarations using the above type definitions *) -function a: string2int -function b: integer_2_string2int +function a: int2int +function b: integer_2_int2int function c: string2int_2_integer function d: iic2b d(x,y,z) := { [string: s] - return 0; + return true; } function entry: string2int a(x) := { [string : s] - s := x; + x:= printInteger(x); + return 0; } @@ -50,7 +51,7 @@ b(x) := { c(x) := { [string: s] s := "Hi!"; - return x(s); + return 3; } @@ -58,10 +59,11 @@ c(x) := { entry is the first function called *) entry(arg) := { - [integer: result; string2int: f; integer: temp] - temp := a("Hello"); + [integer: result; int2int: f; integer: temp] + temp := 7; f := b(temp); - result := c(f); + result := f(temp); + (*result := c(f);*) if (d(1,2,'c')) then { result := 0; @@ -70,6 +72,6 @@ entry(arg) := { [ Boolean : b] result := entry("hello"); } - result := c(f); + (*result := c(f);*) return result; } diff --git a/tests/programs/array.alpha b/tests/programs/array.alpha new file mode 100644 index 0000000..9022f19 --- /dev/null +++ b/tests/programs/array.alpha @@ -0,0 +1,20 @@ +#include "std.alpha" + +type main: string -> integer +function entry: main + +(* maybe some other type definitions *) + +entry(arg) := { + [ string: one_name; string: another_name ] + + one_name := "a string literal"; + + another_name := reserve another_name(4); + another_name(0) := 'C'; + another_name(1) := 'a'; + another_name(2) := 'r'; + another_name(3) := 'l'; + + return 0; +} \ No newline at end of file diff --git a/tests/programs/factorial.alpha b/tests/programs/factorial.alpha new file mode 100644 index 0000000..4f02932 --- /dev/null +++ b/tests/programs/factorial.alpha @@ -0,0 +1,42 @@ +#include "std.alpha" + +function entry: string2integer +function calc: integerXinteger2integer + +calc(counter, result) := { + + if ( counter = 0 ) then { + return result; + } else { + result := result * counter; + counter := counter - 1; + return calc(counter, result); + } +} + + + +entry (arg) := { + [integer: result; integer: userInput] + + result := printC('E'); + result := printC('n'); + result := printC('t'); + result := printC('e'); + result := printC('r'); + result := printC(' '); + result := printC('N'); + result := printC('u'); + result := printC('m'); + result := printC('b'); + result := printC('e'); + result := printC('r'); + result := printC(':'); + result := printC(' '); + + userInput := inI(1); + userInput := calc(userInput, 1); + result := printI(userInput); + + return 0; +} \ No newline at end of file diff --git a/tests/programs/fib.alpha b/tests/programs/fib.alpha index 2f33e06..1a9d185 100644 --- a/tests/programs/fib.alpha +++ b/tests/programs/fib.alpha @@ -1 +1,47 @@ -(* TODO: Prints out fib sequence. *) \ No newline at end of file +#include "std.alpha" + +function entry : string2integer +function fib : integer2integer + +fib(i) := { + + if (i < 1) then { + return 0; + } else { + i := i; + } + + if (i < 2) then { + return i; + } else { + i := i; + } + + return fib(i-1) + fib(i-2); +} + +entry (arg) := { + [ integer: result; integer: input; integer: fibValue] + + result := printC('E'); + result := printC('n'); + result := printC('t'); + result := printC('e'); + result := printC('r'); + result := printC(' '); + result := printC('N'); + result := printC('u'); + result := printC('m'); + result := printC('b'); + result := printC('e'); + result := printC('r'); + result := printC(':'); + result := printC(' '); + + input := inI(1); + fibValue := fib(input); + + result := printI(fibValue); + + return 0; +} diff --git a/tests/programs/helloworld.alpha b/tests/programs/helloworld.alpha index 109cae8..abc43a3 100644 --- a/tests/programs/helloworld.alpha +++ b/tests/programs/helloworld.alpha @@ -1,11 +1,23 @@ #include "std.alpha" -entry (arg) := { - [string: str; character: ch; integer: result] +function entry: string2integer - ch := 'h'; - str := "Hello World!"; - result := printCharacter(ch); +entry (arg) := { + [integer: result] + + result := printCharacter('H'); + result := printCharacter('e'); + result := printCharacter('l'); + result := printCharacter('l'); + result := printCharacter('o'); + result := printCharacter(' '); + result := printCharacter('W'); + result := printCharacter('o'); + result := printCharacter('r'); + result := printCharacter('l'); + result := printCharacter('d'); + result := printCharacter('!'); + result := printCharacter('\n'); return 0; -} \ No newline at end of file +} diff --git a/tests/programs/ll.alpha b/tests/programs/ll.alpha deleted file mode 100644 index 4178a08..0000000 --- a/tests/programs/ll.alpha +++ /dev/null @@ -1 +0,0 @@ -(* TODO: creates a linked list and prints out the chain. *) \ No newline at end of file diff --git a/tests/programs/sp3_if_else_sse.alpha b/tests/programs/sp3_if_else_sse.alpha new file mode 100644 index 0000000..c78ce35 --- /dev/null +++ b/tests/programs/sp3_if_else_sse.alpha @@ -0,0 +1,36 @@ +#include "std.alpha" +type rec: [character: x; integer: y] + +type T2: rec -> integer + +type main: string -> integer +function entry: main + (* +function bar: T2 + +bar (r,s) := { + return 0; +} + + *) +entry (arg) := { + [ Boolean:x ; Boolean:y ; Boolean:z ; Boolean:t; integer: c] + x := true; + y := true; + if ( x | y ) then { + + (* + if ( x string one_name : 006000 : 001001 : string : Array Instance another_name : 006000 : 001001 : string : Array Instance many_names : 006000 : 001001 : a_of_s : Array Instance +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: diff --git a/tests/sprint2/expected/sp2_valid_assignable_and_mem.st.exp b/tests/sprint2/expected/sp2_valid_assignable_and_mem.st.exp index e755b52..3714bab 100644 --- a/tests/sprint2/expected/sp2_valid_assignable_and_mem.st.exp +++ b/tests/sprint2/expected/sp2_valid_assignable_and_mem.st.exp @@ -9,5 +9,13 @@ reserve type : 001001 : : integer -> address reserve : 001001 : : reserve type : Function not defined before runtime release type : 001001 : : address -> integer : Type of Function release : 001001 : : release type : Function not defined before runtime +main : 001001 : : string -> integer : Type of Function +entry : 001001 : : main : Function Definition that starts at line 7 +rec : 001001 : : Record Type : elements-2 size-8 bytes +T2 : 001001 : : rec -> integer : Type of Function ------------------------------:--------:--------:-----------------------------------:-----------------------------------: - : 000000 : 001001 : : Empty Scope +arg : 007000 : 001001 : string : Array Instance +w : 007000 : 001001 : rec : Record Instance +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +x : 004000 : 001001 : integer : Primitive Instance +y : 004000 : 001001 : integer : Primitive Instance diff --git a/tests/sprint2/test/sp2_valid_assignable_and_mem.alpha b/tests/sprint2/test/sp2_valid_assignable_and_mem.alpha index 9fe5655..3fc875e 100644 --- a/tests/sprint2/test/sp2_valid_assignable_and_mem.alpha +++ b/tests/sprint2/test/sp2_valid_assignable_and_mem.alpha @@ -1,5 +1,5 @@ (* TEST: [-st] *) -ype main: string -> integer +type main: string -> integer function entry: main type rec: [integer: x; integer: y] diff --git a/tests/sprint3/expected/sp3_and_or_type_check.asc.exp b/tests/sprint3/expected/sp3_and_or_type_check.asc.exp index fb7fe0c..304d268 100644 --- a/tests/sprint3/expected/sp3_and_or_type_check.asc.exp +++ b/tests/sprint3/expected/sp3_and_or_type_check.asc.exp @@ -57,26 +57,26 @@ LINE (28:2) ** TYPE ERROR: Undefined variable b 029: b := 1 | b; LINE (29:12) ** TYPE ERROR: Invalid type passed to assignable. - LINE (29:12) ** TYPE ERROR: Object $t9 of type integer and Object undefined of type undefined must both be Boolean + LINE (29:12) ** TYPE ERROR: Object $t11 of type integer and Object undefined of type undefined must both be Boolean LINE (29:11) ** TYPE ERROR: Undefined variable b LINE (29:2) ** TYPE ERROR: Undefined variable b 030: b := b | 1; LINE (30:12) ** TYPE ERROR: Invalid type passed to assignable. - LINE (30:12) ** TYPE ERROR: Object undefined of type undefined and Object $t10 of type integer must both be Boolean + LINE (30:12) ** TYPE ERROR: Object undefined of type undefined and Object $t13 of type integer must both be Boolean LINE (30:7) ** TYPE ERROR: Undefined variable b LINE (30:2) ** TYPE ERROR: Undefined variable b 031: b := b & 1; LINE (31:12) ** TYPE ERROR: Invalid type passed to assignable. - LINE (31:12) ** TYPE ERROR: Object undefined of type undefined and Object $t11 of type integer must both be Boolean + LINE (31:12) ** TYPE ERROR: Object undefined of type undefined and Object $t15 of type integer must both be Boolean LINE (31:7) ** TYPE ERROR: Undefined variable b LINE (31:2) ** TYPE ERROR: Undefined variable b 032: b := 1 & b; LINE (32:12) ** TYPE ERROR: Invalid type passed to assignable. - LINE (32:12) ** TYPE ERROR: Object $t12 of type integer and Object undefined of type undefined must both be Boolean + LINE (32:12) ** TYPE ERROR: Object $t17 of type integer and Object undefined of type undefined must both be Boolean LINE (32:11) ** TYPE ERROR: Undefined variable b LINE (32:2) ** TYPE ERROR: Undefined variable b 033: b := 1 = 1; - LINE (33:12) ** TYPE ERROR: Assignable Assign Expression - Object undefined of type undefined != Object $t15 of type Boolean + LINE (33:12) ** TYPE ERROR: Assignable Assign Expression - Object undefined of type undefined != Object $t21 of type Boolean LINE (33:12) ** TYPE ERROR: Invalid type passed to assignable. LINE (33:2) ** TYPE ERROR: Undefined variable b 034: @@ -84,7 +84,7 @@ 036: 037: b := 1 = b; LINE (37:12) ** TYPE ERROR: Invalid type passed to assignable. - LINE (37:12) ** TYPE ERROR: Object $t16 of type integer and Object undefined of type undefined must both be the same type + LINE (37:12) ** TYPE ERROR: Object $t22 of type integer and Object undefined of type undefined must both be the same type LINE (37:11) ** TYPE ERROR: Undefined variable b LINE (37:2) ** TYPE ERROR: Undefined variable b 038: diff --git a/tests/sprint3/expected/sp3_arr_reserve.asc.exp b/tests/sprint3/expected/sp3_arr_reserve.asc.exp new file mode 100644 index 0000000..cb1d755 --- /dev/null +++ b/tests/sprint3/expected/sp3_arr_reserve.asc.exp @@ -0,0 +1,10 @@ +001: type main: string -> integer +002: function entry: main +003: type t: 3 -> integer +004: +005: +006: entry (arg) := { +007: [ t:a] +008: a := reserve a(1, 3, 4); +009: return 0; +010: } diff --git a/tests/sprint3/expected/sp3_boolean_binary_op_typecheck.asc.exp b/tests/sprint3/expected/sp3_boolean_binary_op_typecheck.asc.exp index b9eabd2..fd029ac 100644 --- a/tests/sprint3/expected/sp3_boolean_binary_op_typecheck.asc.exp +++ b/tests/sprint3/expected/sp3_boolean_binary_op_typecheck.asc.exp @@ -10,8 +10,8 @@ LINE (8:18) ** TYPE ERROR: Object arr of type address and Object $t2 of type integer must both be the same type 009: b1 := 6<7 & arr2=7; LINE (9:23) ** TYPE ERROR: Assignable Assign Expression - Object b1 of type Boolean != Object undefined of type undefined - LINE (9:23) ** TYPE ERROR: Object $t5 of type Boolean and Object undefined of type undefined must both be Boolean - LINE (9:23) ** TYPE ERROR: Object arr2 of type address and Object $t6 of type integer must both be the same type + LINE (9:23) ** TYPE ERROR: Object $t6 of type Boolean and Object undefined of type undefined must both be Boolean + LINE (9:23) ** TYPE ERROR: Object arr2 of type address and Object $t7 of type integer must both be the same type 010: 011: return 0; 012: } diff --git a/tests/sprint3/expected/sp3_carls_second_mistake.asc.exp b/tests/sprint3/expected/sp3_carls_second_mistake.asc.exp index 51a366e..c67a27b 100644 --- a/tests/sprint3/expected/sp3_carls_second_mistake.asc.exp +++ b/tests/sprint3/expected/sp3_carls_second_mistake.asc.exp @@ -11,20 +11,17 @@ 011: 012: one_name := "a string literal"; 013: another_name := reserve another_name(4); (* reserve space for an an array of character, with 4 members *) - LINE (13:44) ** TYPE ERROR: Assignable Assign Expression - Object another_name of type string != Object undefined of type undefined 014: another_name(0) := 'C'; 015: another_name(1) := 'a'; 016: another_name(2) := 'r'; 017: another_name(3) := 'l'; 018: many_names := reserve many_names(3); - LINE (18:40) ** TYPE ERROR: Assignable Assign Expression - Object many_names of type a_of_s != Object undefined of type undefined 019: many_names(0) := one_name; 020: many_names(1) := another_name; 021: many_names(2) := reserve many_names(2)(6); (* reserve space for an item of the same type as a_of_s(2), an array of character, with 6 members *) LINE (21:45) ** SYNTAX ERROR: Incorrect syntax at token ')' LINE (21:44) ** SYNTAX ERROR: Incorrect syntax at token '6' LINE (21:43) ** SYNTAX ERROR: Incorrect syntax at token '(' - LINE (21:43) ** TYPE ERROR: Assignable Assign Expression - Object $t20 of type string != Object undefined of type undefined 022: many_names(2)(0) := 'P'; 023: many_names(2)(1) := 'a'; 024: many_names(2)(2) := 'r'; diff --git a/tests/sprint3/expected/sp3_if_else.asc.exp b/tests/sprint3/expected/sp3_if_else.asc.exp index 9bdc9e7..0bd0f6d 100644 --- a/tests/sprint3/expected/sp3_if_else.asc.exp +++ b/tests/sprint3/expected/sp3_if_else.asc.exp @@ -11,15 +11,12 @@ 011: } 012: 013: entry (arg) := { -014: [ integer: result ; rec: w] -015: if ( result = result ) then { -016: if ( result < w.y ) then { -017: result := 8; -018: } else { -019: result := 9; -020: }(* *) -021: } else { -022: result := bar('c', 7); -023: } -024: return 0; -025: } +014: [ integer: r ; integer: s; Boolean: x] +015: (* x := (r < s) & x; *) +016: if ( ( r < s ) & (s = r) ) then { +017: r := 5; +018: } else { +019: r := 7; +020: } +021: return 0; +022: } diff --git a/tests/sprint3/expected/sp3_if_else_nested_exp.asc.exp b/tests/sprint3/expected/sp3_if_else_nested_exp.asc.exp new file mode 100644 index 0000000..1832760 --- /dev/null +++ b/tests/sprint3/expected/sp3_if_else_nested_exp.asc.exp @@ -0,0 +1,25 @@ +001: type rec: [character: x; integer: y] +002: +003: type T2: rec -> integer +004: +005: type main: string -> integer +006: function entry: main +007: function bar: T2 +008: +009: bar (r,s) := { +010: return 0; +011: } +012: +013: entry (arg) := { +014: [ integer: x ; integer: y; integer: z;integer: t] +015: +016: if ( (x = y) < ( z = t ) ) then { +017: if ( (x < y) = ( z < t ) ) then { +018: x := x; +019: } else { +020: x := 1; (* bar('c', 7); *) +021: } +022: } else { +023: return 0; +024: } +025: } diff --git a/tests/sprint3/expected/sp3_if_else_sse.asc.exp b/tests/sprint3/expected/sp3_if_else_sse.asc.exp new file mode 100644 index 0000000..5cb09f5 --- /dev/null +++ b/tests/sprint3/expected/sp3_if_else_sse.asc.exp @@ -0,0 +1,31 @@ +001: type rec: [character: x; integer: y] +002: +003: type T2: rec -> integer +004: +005: type main: string -> integer +006: function entry: main +007: function bar: T2 +008: +009: (* +010: bar (r,s) := { +011: return 0; +012: } +013: +014: *) +015: entry (arg) := { +016: [ Boolean:x ; Boolean:y ; Boolean:z ; Boolean:t] +017: if ( ( x & y ) ) then { +018: +019: (* +020: if ( x integer +004: +005: type main: string -> integer +006: function entry: main +007: function bar: T2 +008: +009: bar (r,s) := { +010: return 0; +011: } +012: +013: entry (arg) := { +014: [ Boolean:x ; Boolean:y ; Boolean:z ; Boolean:t] +015: (* if ( y & (z | t) ) then { *) +016: if ( ( x = y ) & ( z < t ) ) then { +017: (* y := z < t; *) +018: t:= 0; +019: } else { +020: (* t := z = t; *) +021: z := 1; +022: } +023: (* +024: if ( x & y ) then { +025: t := true; +026: } else { +027: y := true; +028: } +029: *) +030: (* } else { *) +031: (* } *) +032: (* x := x & y; *) +033: return 0; +034: } diff --git a/tests/sprint3/expected/sp3_while_nested_bools.asc.exp b/tests/sprint3/expected/sp3_while_nested_bools.asc.exp new file mode 100644 index 0000000..a3444d6 --- /dev/null +++ b/tests/sprint3/expected/sp3_while_nested_bools.asc.exp @@ -0,0 +1,29 @@ +001: type rec: [character: x; integer: y] +002: +003: type T2: rec -> integer +004: +005: type main: string -> integer +006: function entry: main +007: function bar: T2 +008: +009: bar (r,s) := { +010: return 0; +011: } +012: +013: entry (arg) := { +014: [ Boolean: x ; Boolean: y; Boolean: z;Boolean: t] +015: while ( ((x = y)) < ( z | t ) ) { +016: while ( (x & y) = ( z < t ) ) { +017: y := y; +018: } +019: (* +020: x := x; +021: *) +022: if ( (x = y) = ( z < t ) ) then { +023: x := 1; +024: } else { +025: x := 1; +026: } +027: } +028: return 0; +029: } diff --git a/tests/sprint3/expected/sp3_while_sse.asc.exp b/tests/sprint3/expected/sp3_while_sse.asc.exp new file mode 100644 index 0000000..fe8e2ae --- /dev/null +++ b/tests/sprint3/expected/sp3_while_sse.asc.exp @@ -0,0 +1,27 @@ +001: type rec: [character: x; integer: y] +002: +003: type T2: rec -> integer +004: +005: type main: string -> integer +006: function entry: main +007: function bar: T2 +008: +009: bar (r,s) := { +010: return 0; +011: } +012: +013: entry (arg) := { +014: [ Boolean:x ; Boolean:y ; Boolean:z ; Boolean:t] +015: while ( ( x | y ) (* | ( z | t ) *) ) { +016: (* +017: if ( ( x < y ) & ( z = t ) ) then { +018: y := z < t; +019: } else { +020: t := z = t; +021: } +022: *) +023: y := t < z; (* bar('c', 7); *) +024: } +025: (* x := x & y; *) +026: return 0; +027: } diff --git a/tests/sprint3/test/sp3_arr_reserve.alpha b/tests/sprint3/test/sp3_arr_reserve.alpha index 114da34..e78640f 100644 --- a/tests/sprint3/test/sp3_arr_reserve.alpha +++ b/tests/sprint3/test/sp3_arr_reserve.alpha @@ -1,4 +1,4 @@ - +(* TEST: [-asc -tc] *) type main: string -> integer function entry: main type t: 3 -> integer diff --git a/tests/sprint3/test/sp3_if_else.alpha b/tests/sprint3/test/sp3_if_else.alpha index 40c2580..6825b77 100644 --- a/tests/sprint3/test/sp3_if_else.alpha +++ b/tests/sprint3/test/sp3_if_else.alpha @@ -13,8 +13,8 @@ bar (r,s) := { entry (arg) := { [ integer: r ; integer: s; Boolean: x] - x := (r < s) & x; - if ( r < s ) then { + (* x := (r < s) & x; *) + if ( ( r < s ) & (s = r) ) then { r := 5; } else { r := 7; diff --git a/tests/sprint3/test/sp3_if_else_nested_exp.alpha b/tests/sprint3/test/sp3_if_else_nested_exp.alpha index 08161f2..c89da43 100644 --- a/tests/sprint3/test/sp3_if_else_nested_exp.alpha +++ b/tests/sprint3/test/sp3_if_else_nested_exp.alpha @@ -1,3 +1,4 @@ +(* TEST: [-asc -tc] *) type rec: [character: x; integer: y] type T2: rec -> integer diff --git a/tests/sprint3/test/sp3_if_else_sse.alpha b/tests/sprint3/test/sp3_if_else_sse.alpha index cbbf116..8cb74e3 100644 --- a/tests/sprint3/test/sp3_if_else_sse.alpha +++ b/tests/sprint3/test/sp3_if_else_sse.alpha @@ -1,3 +1,4 @@ +(* TEST: [-asc -tc] *) type rec: [character: x; integer: y] type T2: rec -> integer diff --git a/tests/sprint3/test/sp3_if_else_sse2.alpha b/tests/sprint3/test/sp3_if_else_sse2.alpha index e226dd6..c5a1a33 100644 --- a/tests/sprint3/test/sp3_if_else_sse2.alpha +++ b/tests/sprint3/test/sp3_if_else_sse2.alpha @@ -1,3 +1,4 @@ +(* TEST: [-asc -tc] *) type rec: [character: x; integer: y] type T2: rec -> integer diff --git a/tests/sprint3/test/sp3_while_nested_bools.alpha b/tests/sprint3/test/sp3_while_nested_bools.alpha index 11765c0..e9ac27e 100644 --- a/tests/sprint3/test/sp3_while_nested_bools.alpha +++ b/tests/sprint3/test/sp3_while_nested_bools.alpha @@ -1,3 +1,4 @@ +(* TEST: [-asc -tc] *) type rec: [character: x; integer: y] type T2: rec -> integer diff --git a/tests/sprint3/test/sp3_while_sse.alpha b/tests/sprint3/test/sp3_while_sse.alpha index 61b1731..58d8f6a 100644 --- a/tests/sprint3/test/sp3_while_sse.alpha +++ b/tests/sprint3/test/sp3_while_sse.alpha @@ -1,3 +1,4 @@ +(* TEST: [-asc -tc] *) type rec: [character: x; integer: y] type T2: rec -> integer diff --git a/tests/sprint4/expected/sp4_cg_add.asc.exp b/tests/sprint4/expected/sp4_cg_add.asc.exp index bff5d97..d4499a0 100644 --- a/tests/sprint4/expected/sp4_cg_add.asc.exp +++ b/tests/sprint4/expected/sp4_cg_add.asc.exp @@ -1,10 +1,47 @@ -001: type main: integer -> integer -002: function test: main -003: -004: test (a) := { -005: [integer:x; integer:y] -006: y := 1; -007: x := 3; -008: y := x + y; -009: return y; -010: } \ No newline at end of file +001: +002: type string: 1 -> character +003: type BooleanXBoolean: [Boolean: x; Boolean: y] +004: type characterXcharacter: [character: x; character: y] +005: type integerXinteger: [integer: x; integer: y] +006: +007: type Boolean2Boolean: Boolean -> Boolean +008: type integer2integer: integer -> integer +009: type character2integer: character -> integer +010: type Boolean2integer: Boolean -> integer +011: type string2integer: string -> integer +012: type integerXinteger2integer: integerXinteger -> integer +013: type integerXinteger2Boolean: integerXinteger -> Boolean +014: type characterXcharacter2Boolean: characterXcharacter -> Boolean +015: type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +016: type integer2address: integer -> address +017: type address2integer: address -> integer +018: type integer2string: integer -> string +019: type integer2character: integer -> character +020: type integer2Boolean: integer -> Boolean +021: +022: +023: external function printInteger: integer2integer +024: external function printCharacter: character2integer +025: external function printBoolean: Boolean2integer +026: +027: external function printS: string2integer +028: external function printI: integer2integer +029: external function printC: character2integer +030: external function printB: Boolean2integer +031: +032: external function inS: integer2string +033: external function inI: integer2integer +034: external function inC: integer2character +035: +036: function entry: string2integer +037: +038: entry (arg) := { +039: [integer:x; integer:y; integer: result] +040: +041: y := 1; +042: x := 3; +043: y := x + y; +044: +045: result := printInteger(y); +046: return y; +047: } \ No newline at end of file diff --git a/tests/sprint4/expected/sp4_cg_add.ir.exp b/tests/sprint4/expected/sp4_cg_add.ir.exp index d0a05ab..80451f3 100644 --- a/tests/sprint4/expected/sp4_cg_add.ir.exp +++ b/tests/sprint4/expected/sp4_cg_add.ir.exp @@ -1,8 +1,12 @@ - 1: func : test - 2: $t0 = 1 - 3: y = $t0 - 4: $t1 = 3 - 5: x = $t1 - 6: $t2 = x + y - 7: y = $t2 - 8: return : y + 1: func_dec : entry + 2: func : entry + 3: $t0 = 1 + 4: y = $t0 + 5: $t1 = 3 + 6: x = $t1 + 7: $t2 = x + y + 8: y = $t2 + 9: param y + 10: call : printInteger 1 + 11: result = $t3 + 12: return : y diff --git a/tests/sprint4/expected/sp4_cg_add.s.exp b/tests/sprint4/expected/sp4_cg_add.s.exp index 4764400..c47a3d4 100644 --- a/tests/sprint4/expected/sp4_cg_add.s.exp +++ b/tests/sprint4/expected/sp4_cg_add.s.exp @@ -1,12 +1,26 @@ - movl $1, -4(%rbp) #constant assign - movl -4(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end - movl $3, -12(%rbp) #constant assign +.globl entry +entry: + pushq %rbp + movq %rsp, %rbp + subq $400, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $1, -12(%rbp) #constant assign movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end - movl -16(%rbp), %eax #addition start - movl -16(%rbp), %eax - addl %edx, %eax - movl %eax, -20(%rbp) #addition end + movl $3, -20(%rbp) #constant assign movl -20(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end + movl %eax, -24(%rbp) #assign end + + movl -24(%rbp), %eax #addition start + addl -16(%rbp), %eax + movl %eax, -28(%rbp) #addition end + movl -28(%rbp), %eax #assign start + movl %eax, -16(%rbp) #assign end + movl -16(%rbp), %edi #adding param start + call printInteger + movl %eax, -32(%rbp) #store return from call + movl -32(%rbp), %eax #assign start + movl %eax, -36(%rbp) #assign end + movl -16(%rbp), %eax #return y + leave + ret diff --git a/tests/sprint4/expected/sp4_cg_and.asc.exp b/tests/sprint4/expected/sp4_cg_and.asc.exp index 8676177..17aa547 100644 --- a/tests/sprint4/expected/sp4_cg_and.asc.exp +++ b/tests/sprint4/expected/sp4_cg_and.asc.exp @@ -1,10 +1,50 @@ -001: type main: integer -> integer -002: function test: main -003: -004: test (a) := { -005: [Boolean:b; Boolean: c; Boolean: d] -006: c := true; -007: d := false; -008: d := c & d; -009: return 1; -010: } \ No newline at end of file +001: +002: type string: 1 -> character +003: type BooleanXBoolean: [Boolean: x; Boolean: y] +004: type characterXcharacter: [character: x; character: y] +005: type integerXinteger: [integer: x; integer: y] +006: +007: type Boolean2Boolean: Boolean -> Boolean +008: type integer2integer: integer -> integer +009: type character2integer: character -> integer +010: type Boolean2integer: Boolean -> integer +011: type string2integer: string -> integer +012: type integerXinteger2integer: integerXinteger -> integer +013: type integerXinteger2Boolean: integerXinteger -> Boolean +014: type characterXcharacter2Boolean: characterXcharacter -> Boolean +015: type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +016: type integer2address: integer -> address +017: type address2integer: address -> integer +018: type integer2string: integer -> string +019: type integer2character: integer -> character +020: type integer2Boolean: integer -> Boolean +021: +022: +023: external function printInteger: integer2integer +024: external function printCharacter: character2integer +025: external function printBoolean: Boolean2integer +026: +027: external function printS: string2integer +028: external function printI: integer2integer +029: external function printC: character2integer +030: external function printB: Boolean2integer +031: +032: external function inS: integer2string +033: external function inI: integer2integer +034: external function inC: integer2character +035: +036: function entry: string2integer +037: +038: entry (arg) := { +039: [Boolean:b; Boolean: c; Boolean: d; integer: result] +040: +041: z := true; + LINE (41:14) ** TYPE ERROR: Assignable Assign Expression - Object undefined of type undefined != Object $t0 of type Boolean + LINE (41:14) ** TYPE ERROR: Invalid type passed to assignable. + LINE (41:5) ** TYPE ERROR: Undefined variable z +042: d := false; +043: d := c & d; +044: +045: result := printBoolean(d); +046: return 1; +047: } \ No newline at end of file diff --git a/tests/sprint4/expected/sp4_cg_calls.asc.exp b/tests/sprint4/expected/sp4_cg_calls.asc.exp new file mode 100644 index 0000000..831976b --- /dev/null +++ b/tests/sprint4/expected/sp4_cg_calls.asc.exp @@ -0,0 +1,60 @@ +001: +002: type string: 1 -> character +003: type BooleanXBoolean: [Boolean: x; Boolean: y] +004: type characterXcharacter: [character: x; character: y] +005: type integerXinteger: [integer: x; integer: y] +006: +007: type Boolean2Boolean: Boolean -> Boolean +008: type integer2integer: integer -> integer +009: type character2integer: character -> integer +010: type Boolean2integer: Boolean -> integer +011: type string2integer: string -> integer +012: type integerXinteger2integer: integerXinteger -> integer +013: type integerXinteger2Boolean: integerXinteger -> Boolean +014: type characterXcharacter2Boolean: characterXcharacter -> Boolean +015: type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +016: type integer2address: integer -> address +017: type address2integer: address -> integer +018: type integer2string: integer -> string +019: type integer2character: integer -> character +020: type integer2Boolean: integer -> Boolean +021: +022: +023: external function printInteger: integer2integer +024: external function printCharacter: character2integer +025: external function printBoolean: Boolean2integer +026: +027: external function printS: string2integer +028: external function printI: integer2integer +029: external function printC: character2integer +030: external function printB: Boolean2integer +031: +032: external function inS: integer2string +033: external function inI: integer2integer +034: external function inC: integer2character +035: +036: function entry: string2integer +037: +038: type rec: [integer: x; integer: y; integer: z; integer: a; integer: b; integer: c; integer: d] +039: type T2: rec -> integer +040: type T: integer -> integer +041: function bar: T2 +042: function ahh: T +043: +044: ahh (a) := { +045: a := printInteger(a); +046: return -1; +047: } +048: +049: bar (a, b, c,d,e,f,g) := { +050: a := printInteger(g); +051: return b; +052: } +053: +054: entry (arg) := { +055: [integer:x; integer:y; integer: result; character: a] +056: a := 'a'; +057: x := printCharacter(a); +058: result := bar(1,2,3,4,5,6,7); +059: return 1; +060: } diff --git a/tests/sprint4/expected/sp4_cg_calls.ir.exp b/tests/sprint4/expected/sp4_cg_calls.ir.exp new file mode 100644 index 0000000..cbaa89e --- /dev/null +++ b/tests/sprint4/expected/sp4_cg_calls.ir.exp @@ -0,0 +1,39 @@ + 1: func_dec : entry + 2: func_dec : bar + 3: func_dec : ahh + 4: func : ahh + 5: param a + 6: call : printInteger 1 + 7: a = $t0 + 8: $t1 = 1 + 9: $t2 = -$t1 + 10: return : $t2 + 11: func : bar + 12: param g + 13: call : printInteger 1 + 14: a = $t3 + 15: return : b + 16: func : entry + 17: $t4 = a + 18: a = $t4 + 19: param a + 20: call : printCharacter 1 + 21: x = $t5 + 22: $t6 = 1 + 23: $t7 = 2 + 24: $t8 = 3 + 25: $t9 = 4 + 26: $t10 = 5 + 27: $t11 = 6 + 28: $t12 = 7 + 29: param $t12 + 30: param $t11 + 31: param $t10 + 32: param $t9 + 33: param $t8 + 34: param $t7 + 35: param $t6 + 36: call : bar 7 + 37: result = $t13 + 38: $t14 = 1 + 39: return : $t14 diff --git a/tests/sprint4/expected/sp4_cg_calls.s.exp b/tests/sprint4/expected/sp4_cg_calls.s.exp new file mode 100644 index 0000000..0d28c99 --- /dev/null +++ b/tests/sprint4/expected/sp4_cg_calls.s.exp @@ -0,0 +1,74 @@ +.globl entry +ahh: + pushq %rbp + movq %rsp, %rbp + subq $576, %rsp + movl %edi, -4(%rbp) #FunctionStart1param end + movl -4(%rbp), %edi #adding param start + call printInteger + movl %eax, -8(%rbp) #store return from call + movl -8(%rbp), %eax #assign start + movl %eax, -4(%rbp) #assign end + movl $1, -12(%rbp) #constant assign + movl -12(%rbp), %eax #negation start + negl %eax + movl %eax, -16(%rbp) #negation end + movl -16(%rbp), %eax #return $t2 + leave + ret +bar: + pushq %rbp + movq %rsp, %rbp + subq $576, %rsp + movl 20(%rbp), %eax #FunctionStart1Param start + movl %eax, -4(%rbp) #FunctionStart1param end + movl %r9d, -12(%rbp) #FunctionStart1param end + movl %r8d, -16(%rbp) #FunctionStart1param end + movl %ecx, -20(%rbp) #FunctionStart1param end + movl %edx, -24(%rbp) #FunctionStart1param end + movl %esi, -28(%rbp) #FunctionStart1param end + movl %edi, -32(%rbp) #FunctionStart1param end + movl -32(%rbp), %edi #adding param start + call printInteger + movl %eax, -36(%rbp) #store return from call + movl -36(%rbp), %eax #assign start + movl %eax, -4(%rbp) #assign end + movl -12(%rbp), %eax #return b + leave + ret +entry: + pushq %rbp + movq %rsp, %rbp + subq $576, %rsp + movl %edi, -12(%rbp) #FunctionStart1param end + movl $97, -13(%rbp) #constant assign + movl -13(%rbp), %eax #assign start + movl %eax, -14(%rbp) #assign end + movl -14(%rbp), %edi #adding param start + call printCharacter + movl %eax, -20(%rbp) #store return from call + movl -20(%rbp), %eax #assign start + movl %eax, -24(%rbp) #assign end + movl $1, -28(%rbp) #constant assign + movl $2, -32(%rbp) #constant assign + movl $3, -36(%rbp) #constant assign + movl $4, -40(%rbp) #constant assign + movl $5, -44(%rbp) #constant assign + movl $6, -48(%rbp) #constant assign + movl $7, -52(%rbp) #constant assign + movl -52(%rbp), %edi #adding param start + movl -48(%rbp), %esi #adding param start + movl -44(%rbp), %edx #adding param start + movl -40(%rbp), %ecx #adding param start + movl -36(%rbp), %r8d #adding param start + movl -32(%rbp), %r9d #adding param start + movl -28(%rbp), %eax #adding param start + movl %eax, 152(%rbp) #adding param end + call bar + movl %eax, -60(%rbp) #store return from call + movl -60(%rbp), %eax #assign start + movl %eax, -64(%rbp) #assign end + movl $1, -68(%rbp) #constant assign + movl -68(%rbp), %eax #return $t14 + leave + ret diff --git a/tests/sprint4/expected/sp4_cg_div.asc.exp b/tests/sprint4/expected/sp4_cg_div.asc.exp index 87b68f2..5e0a832 100644 --- a/tests/sprint4/expected/sp4_cg_div.asc.exp +++ b/tests/sprint4/expected/sp4_cg_div.asc.exp @@ -1,10 +1,47 @@ -001: type main: integer -> integer -002: function test: main -003: -004: test (a) := { -005: [integer:x; integer:y] -006: y := 1; -007: x := 3; -008: y := x / y; -009: return y; -010: } \ No newline at end of file +001: +002: type string: 1 -> character +003: type BooleanXBoolean: [Boolean: x; Boolean: y] +004: type characterXcharacter: [character: x; character: y] +005: type integerXinteger: [integer: x; integer: y] +006: +007: type Boolean2Boolean: Boolean -> Boolean +008: type integer2integer: integer -> integer +009: type character2integer: character -> integer +010: type Boolean2integer: Boolean -> integer +011: type string2integer: string -> integer +012: type integerXinteger2integer: integerXinteger -> integer +013: type integerXinteger2Boolean: integerXinteger -> Boolean +014: type characterXcharacter2Boolean: characterXcharacter -> Boolean +015: type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +016: type integer2address: integer -> address +017: type address2integer: address -> integer +018: type integer2string: integer -> string +019: type integer2character: integer -> character +020: type integer2Boolean: integer -> Boolean +021: +022: +023: external function printInteger: integer2integer +024: external function printCharacter: character2integer +025: external function printBoolean: Boolean2integer +026: +027: external function printS: string2integer +028: external function printI: integer2integer +029: external function printC: character2integer +030: external function printB: Boolean2integer +031: +032: external function inS: integer2string +033: external function inI: integer2integer +034: external function inC: integer2character +035: +036: function entry: string2integer +037: +038: entry (arg) := { +039: [integer:x; integer:y; integer: result] +040: +041: x := 24; +042: y := 3; +043: y := x / y; +044: +045: result := printInteger(y); +046: return y; +047: } \ No newline at end of file diff --git a/tests/sprint4/expected/sp4_cg_div.ir.exp b/tests/sprint4/expected/sp4_cg_div.ir.exp index 905d038..56f58fd 100644 --- a/tests/sprint4/expected/sp4_cg_div.ir.exp +++ b/tests/sprint4/expected/sp4_cg_div.ir.exp @@ -1,8 +1,12 @@ - 1: func : test - 2: $t0 = 1 - 3: y = $t0 - 4: $t1 = 3 - 5: x = $t1 - 6: $t2 = x / y - 7: y = $t2 - 8: return : y + 1: func_dec : entry + 2: func : entry + 3: $t0 = 24 + 4: x = $t0 + 5: $t1 = 3 + 6: y = $t1 + 7: $t2 = x / y + 8: y = $t2 + 9: param y + 10: call : printInteger 1 + 11: result = $t3 + 12: return : y diff --git a/tests/sprint4/expected/sp4_cg_div.s.exp b/tests/sprint4/expected/sp4_cg_div.s.exp index 1a71c6e..53861da 100644 --- a/tests/sprint4/expected/sp4_cg_div.s.exp +++ b/tests/sprint4/expected/sp4_cg_div.s.exp @@ -1,12 +1,26 @@ - movl $1, -4(%rbp) #constant assign - movl -4(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end - movl $3, -12(%rbp) #constant assign +.globl entry +entry: + pushq %rbp + movq %rsp, %rbp + subq $400, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $24, -12(%rbp) #constant assign movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end + movl $3, -20(%rbp) #constant assign + movl -20(%rbp), %eax #assign start + movl %eax, -24(%rbp) #assign end movl -16(%rbp), %eax #division start cltd - idivl -8(%rbp) - movl %eax, -20(%rbp) #division end - movl -20(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end + idivl -24(%rbp) + movl %eax, -28(%rbp) #division end + movl -28(%rbp), %eax #assign start + movl %eax, -24(%rbp) #assign end + movl -24(%rbp), %edi #adding param start + call printInteger + movl %eax, -32(%rbp) #store return from call + movl -32(%rbp), %eax #assign start + movl %eax, -36(%rbp) #assign end + movl -24(%rbp), %eax #return y + leave + ret diff --git a/tests/sprint4/expected/sp4_cg_equal_to.asc.exp b/tests/sprint4/expected/sp4_cg_equal_to.asc.exp index df0cbd5..d43e036 100644 --- a/tests/sprint4/expected/sp4_cg_equal_to.asc.exp +++ b/tests/sprint4/expected/sp4_cg_equal_to.asc.exp @@ -1,10 +1,47 @@ -001: type main: integer -> integer -002: function test: main -003: -004: test (a) := { -005: [Boolean: b; integer: x; integer: y] -006: x := 1; -007: y := 2; -008: b := x = y; -009: return 1; -010: } \ No newline at end of file +001: +002: type string: 1 -> character +003: type BooleanXBoolean: [Boolean: x; Boolean: y] +004: type characterXcharacter: [character: x; character: y] +005: type integerXinteger: [integer: x; integer: y] +006: +007: type Boolean2Boolean: Boolean -> Boolean +008: type integer2integer: integer -> integer +009: type character2integer: character -> integer +010: type Boolean2integer: Boolean -> integer +011: type string2integer: string -> integer +012: type integerXinteger2integer: integerXinteger -> integer +013: type integerXinteger2Boolean: integerXinteger -> Boolean +014: type characterXcharacter2Boolean: characterXcharacter -> Boolean +015: type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +016: type integer2address: integer -> address +017: type address2integer: address -> integer +018: type integer2string: integer -> string +019: type integer2character: integer -> character +020: type integer2Boolean: integer -> Boolean +021: +022: +023: external function printInteger: integer2integer +024: external function printCharacter: character2integer +025: external function printBoolean: Boolean2integer +026: +027: external function printS: string2integer +028: external function printI: integer2integer +029: external function printC: character2integer +030: external function printB: Boolean2integer +031: +032: external function inS: integer2string +033: external function inI: integer2integer +034: external function inC: integer2character +035: +036: function entry: string2integer +037: +038: entry (arg) := { +039: [Boolean: b; integer: x; integer: y; integer: result] +040: +041: x := 1; +042: y := 2; +043: b := x = y; +044: +045: result := printBoolean(b); +046: return 1; +047: } \ No newline at end of file diff --git a/tests/sprint4/expected/sp4_cg_equal_to.ir.exp b/tests/sprint4/expected/sp4_cg_equal_to.ir.exp index 1739814..c8ec780 100644 --- a/tests/sprint4/expected/sp4_cg_equal_to.ir.exp +++ b/tests/sprint4/expected/sp4_cg_equal_to.ir.exp @@ -1,10 +1,16 @@ - 1: func : test - 2: $t0 = 1 - 3: x = $t0 - 4: $t1 = 2 - 5: y = $t1 - 6: if ( x = y ) GOTO 0 - 7: GOTO : 0 - 8: b = $t2 - 9: $t3 = 1 - 10: return : $t3 + 1: func_dec : entry + 2: func : entry + 3: $t0 = 1 + 4: x = $t0 + 5: $t1 = 2 + 6: y = $t1 + 7: $t2 = x == y + 8: if $t2 True GOTO 1 + 9: GOTO : 1 + 10: Label : 1 + 11: b = $t2 + 12: param b + 13: call : printBoolean 1 + 14: result = $t3 + 15: $t4 = 1 + 16: return : $t4 diff --git a/tests/sprint4/expected/sp4_cg_equal_to.s.exp b/tests/sprint4/expected/sp4_cg_equal_to.s.exp index 5f73e0b..038d473 100644 --- a/tests/sprint4/expected/sp4_cg_equal_to.s.exp +++ b/tests/sprint4/expected/sp4_cg_equal_to.s.exp @@ -1,11 +1,32 @@ - movl $1, -4(%rbp) #constant assign - movl -4(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end - movl $2, -12(%rbp) #constant assign +.globl entry +entry: + pushq %rbp + movq %rsp, %rbp + subq $416, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $1, -12(%rbp) #constant assign movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end - movl -8(%rbp), %eax #equal to start - cmpl -16(%rbp), %eax + movl $2, -20(%rbp) #constant assign + movl -20(%rbp), %eax #assign start + movl %eax, -24(%rbp) #assign end + movl -16(%rbp), %eax #equal to start + cmpl -24(%rbp), %eax sete %al - movb %al, -15(%rbp) #equal to end - movl $1, -20(%rbp) #constant assign + movb $0, -25(%rbp) + movb %al, -25(%rbp) #equal to end + cmpb $0, -25(%rbp) #if true start + jne .L1 #if true end + jmp .L1 +.L1: + movl -25(%rbp), %eax #assign start + movl %eax, -26(%rbp) #assign end + movl -26(%rbp), %edi #adding param start + call printBoolean + movl %eax, -32(%rbp) #store return from call + movl -32(%rbp), %eax #assign start + movl %eax, -36(%rbp) #assign end + movl $1, -40(%rbp) #constant assign + movl -40(%rbp), %eax #return $t4 + leave + ret diff --git a/tests/sprint4/expected/sp4_cg_less_than.asc.exp b/tests/sprint4/expected/sp4_cg_less_than.asc.exp index 63b0136..ab65623 100644 --- a/tests/sprint4/expected/sp4_cg_less_than.asc.exp +++ b/tests/sprint4/expected/sp4_cg_less_than.asc.exp @@ -1,10 +1,47 @@ -001: type main: integer -> integer -002: function test: main -003: -004: test (a) := { -005: [Boolean: b; integer: x; integer: y] -006: x := 1; -007: y := 2; -008: b := x < y; -009: return 1; -010: } \ No newline at end of file +001: +002: type string: 1 -> character +003: type BooleanXBoolean: [Boolean: x; Boolean: y] +004: type characterXcharacter: [character: x; character: y] +005: type integerXinteger: [integer: x; integer: y] +006: +007: type Boolean2Boolean: Boolean -> Boolean +008: type integer2integer: integer -> integer +009: type character2integer: character -> integer +010: type Boolean2integer: Boolean -> integer +011: type string2integer: string -> integer +012: type integerXinteger2integer: integerXinteger -> integer +013: type integerXinteger2Boolean: integerXinteger -> Boolean +014: type characterXcharacter2Boolean: characterXcharacter -> Boolean +015: type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +016: type integer2address: integer -> address +017: type address2integer: address -> integer +018: type integer2string: integer -> string +019: type integer2character: integer -> character +020: type integer2Boolean: integer -> Boolean +021: +022: +023: external function printInteger: integer2integer +024: external function printCharacter: character2integer +025: external function printBoolean: Boolean2integer +026: +027: external function printS: string2integer +028: external function printI: integer2integer +029: external function printC: character2integer +030: external function printB: Boolean2integer +031: +032: external function inS: integer2string +033: external function inI: integer2integer +034: external function inC: integer2character +035: +036: function entry: string2integer +037: +038: entry (arg) := { +039: [Boolean: b; integer: x; integer: y; integer: result] +040: +041: x := 1; +042: y := 2; +043: b := x < y; +044: +045: result := printBoolean(b); +046: return 1; +047: } diff --git a/tests/sprint4/expected/sp4_cg_less_than.ir.exp b/tests/sprint4/expected/sp4_cg_less_than.ir.exp index 5feb329..ff83dbc 100644 --- a/tests/sprint4/expected/sp4_cg_less_than.ir.exp +++ b/tests/sprint4/expected/sp4_cg_less_than.ir.exp @@ -1,10 +1,16 @@ - 1: func : test - 2: $t0 = 1 - 3: x = $t0 - 4: $t1 = 2 - 5: y = $t1 - 6: if ( x < y ) GOTO 0 - 7: GOTO : 0 - 8: b = $t2 - 9: $t3 = 1 - 10: return : $t3 + 1: func_dec : entry + 2: func : entry + 3: $t0 = 1 + 4: x = $t0 + 5: $t1 = 2 + 6: y = $t1 + 7: $t2 = x < y + 8: if $t2 True GOTO 1 + 9: GOTO : 1 + 10: Label : 1 + 11: b = $t2 + 12: param b + 13: call : printBoolean 1 + 14: result = $t3 + 15: $t4 = 1 + 16: return : $t4 diff --git a/tests/sprint4/expected/sp4_cg_less_than.s.exp b/tests/sprint4/expected/sp4_cg_less_than.s.exp index 4ed5ad1..a9235cd 100644 --- a/tests/sprint4/expected/sp4_cg_less_than.s.exp +++ b/tests/sprint4/expected/sp4_cg_less_than.s.exp @@ -1,11 +1,31 @@ - movl $1, -4(%rbp) #constant assign - movl -4(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end - movl $2, -12(%rbp) #constant assign +.globl entry +entry: + pushq %rbp + movq %rsp, %rbp + subq $416, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $1, -12(%rbp) #constant assign movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end - movl -8(%rbp), %eax #less than start - cmpl -16(%rbp), %eax + movl $2, -20(%rbp) #constant assign + movl -20(%rbp), %eax #assign start + movl %eax, -24(%rbp) #assign end + movl -16(%rbp), %eax #less than start + cmpl -24(%rbp), %eax setl %al - movb %al, -15(%rbp) #less than end - movl $1, -20(%rbp) #constant assign + movb %al, -25(%rbp) #less than end + cmpb $0, -25(%rbp) #if true start + jne .L1 #if true end + jmp .L1 +.L1: + movl -25(%rbp), %eax #assign start + movl %eax, -26(%rbp) #assign end + movl -26(%rbp), %edi #adding param start + call printBoolean + movl %eax, -32(%rbp) #store return from call + movl -32(%rbp), %eax #assign start + movl %eax, -36(%rbp) #assign end + movl $1, -40(%rbp) #constant assign + movl -40(%rbp), %eax #return $t4 + leave + ret diff --git a/tests/sprint4/expected/sp4_cg_mod.asc.exp b/tests/sprint4/expected/sp4_cg_mod.asc.exp index 32294ec..3edad31 100644 --- a/tests/sprint4/expected/sp4_cg_mod.asc.exp +++ b/tests/sprint4/expected/sp4_cg_mod.asc.exp @@ -1,10 +1,47 @@ -001: type main: integer -> integer -002: function test: main -003: -004: test (a) := { -005: [integer:x; integer:y] -006: y := 1; -007: x := 3; -008: y := x % y; -009: return y; -010: } \ No newline at end of file +001: +002: type string: 1 -> character +003: type BooleanXBoolean: [Boolean: x; Boolean: y] +004: type characterXcharacter: [character: x; character: y] +005: type integerXinteger: [integer: x; integer: y] +006: +007: type Boolean2Boolean: Boolean -> Boolean +008: type integer2integer: integer -> integer +009: type character2integer: character -> integer +010: type Boolean2integer: Boolean -> integer +011: type string2integer: string -> integer +012: type integerXinteger2integer: integerXinteger -> integer +013: type integerXinteger2Boolean: integerXinteger -> Boolean +014: type characterXcharacter2Boolean: characterXcharacter -> Boolean +015: type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +016: type integer2address: integer -> address +017: type address2integer: address -> integer +018: type integer2string: integer -> string +019: type integer2character: integer -> character +020: type integer2Boolean: integer -> Boolean +021: +022: +023: external function printInteger: integer2integer +024: external function printCharacter: character2integer +025: external function printBoolean: Boolean2integer +026: +027: external function printS: string2integer +028: external function printI: integer2integer +029: external function printC: character2integer +030: external function printB: Boolean2integer +031: +032: external function inS: integer2string +033: external function inI: integer2integer +034: external function inC: integer2character +035: +036: function entry: string2integer +037: +038: entry (arg) := { +039: [integer:x; integer:y; integer: result] +040: +041: x := 4; +042: y := 20; +043: y := y % x; +044: +045: result := printInteger(y); +046: return y; +047: } \ No newline at end of file diff --git a/tests/sprint4/expected/sp4_cg_mod.ir.exp b/tests/sprint4/expected/sp4_cg_mod.ir.exp index b16f1de..1148d7e 100644 --- a/tests/sprint4/expected/sp4_cg_mod.ir.exp +++ b/tests/sprint4/expected/sp4_cg_mod.ir.exp @@ -1,8 +1,12 @@ - 1: func : test - 2: $t0 = 1 - 3: y = $t0 - 4: $t1 = 3 - 5: x = $t1 - 6: $t2 = x % y - 7: y = $t2 - 8: return : y + 1: func_dec : entry + 2: func : entry + 3: $t0 = 4 + 4: x = $t0 + 5: $t1 = 20 + 6: y = $t1 + 7: $t2 = y % x + 8: y = $t2 + 9: param y + 10: call : printInteger 1 + 11: result = $t3 + 12: return : y diff --git a/tests/sprint4/expected/sp4_cg_mod.s.exp b/tests/sprint4/expected/sp4_cg_mod.s.exp index 97d4259..c76ec55 100644 --- a/tests/sprint4/expected/sp4_cg_mod.s.exp +++ b/tests/sprint4/expected/sp4_cg_mod.s.exp @@ -1,12 +1,26 @@ - movl $1, -4(%rbp) #constant assign - movl -4(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end - movl $3, -12(%rbp) #constant assign +.globl entry +entry: + pushq %rbp + movq %rsp, %rbp + subq $400, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $4, -12(%rbp) #constant assign movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end - movl -16(%rbp), %eax #mod start - cltd - idivl -8(%rbp) - movl %edx, -20(%rbp) #mod end + movl $20, -20(%rbp) #constant assign movl -20(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end + movl %eax, -24(%rbp) #assign end + movl -24(%rbp), %eax #mod start + cltd + idivl -16(%rbp) + movl %edx, -28(%rbp) #mod end + movl -28(%rbp), %eax #assign start + movl %eax, -24(%rbp) #assign end + movl -24(%rbp), %edi #adding param start + call printInteger + movl %eax, -32(%rbp) #store return from call + movl -32(%rbp), %eax #assign start + movl %eax, -36(%rbp) #assign end + movl -24(%rbp), %eax #return y + leave + ret diff --git a/tests/sprint4/expected/sp4_cg_mult.asc.exp b/tests/sprint4/expected/sp4_cg_mult.asc.exp index 15138ee..3a66591 100644 --- a/tests/sprint4/expected/sp4_cg_mult.asc.exp +++ b/tests/sprint4/expected/sp4_cg_mult.asc.exp @@ -1,10 +1,47 @@ -001: type main: integer -> integer -002: function test: main -003: -004: test (a) := { -005: [integer:x; integer:y] -006: y := 1; -007: x := 3; -008: y := x * x; -009: return y; -010: } \ No newline at end of file +001: +002: type string: 1 -> character +003: type BooleanXBoolean: [Boolean: x; Boolean: y] +004: type characterXcharacter: [character: x; character: y] +005: type integerXinteger: [integer: x; integer: y] +006: +007: type Boolean2Boolean: Boolean -> Boolean +008: type integer2integer: integer -> integer +009: type character2integer: character -> integer +010: type Boolean2integer: Boolean -> integer +011: type string2integer: string -> integer +012: type integerXinteger2integer: integerXinteger -> integer +013: type integerXinteger2Boolean: integerXinteger -> Boolean +014: type characterXcharacter2Boolean: characterXcharacter -> Boolean +015: type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +016: type integer2address: integer -> address +017: type address2integer: address -> integer +018: type integer2string: integer -> string +019: type integer2character: integer -> character +020: type integer2Boolean: integer -> Boolean +021: +022: +023: external function printInteger: integer2integer +024: external function printCharacter: character2integer +025: external function printBoolean: Boolean2integer +026: +027: external function printS: string2integer +028: external function printI: integer2integer +029: external function printC: character2integer +030: external function printB: Boolean2integer +031: +032: external function inS: integer2string +033: external function inI: integer2integer +034: external function inC: integer2character +035: +036: function entry: string2integer +037: +038: entry (arg) := { +039: [integer:x; integer:y; integer: result] +040: +041: x := 3; +042: y := 20; +043: y := x * y; +044: +045: result := printInteger(y); +046: return y; +047: } \ No newline at end of file diff --git a/tests/sprint4/expected/sp4_cg_mult.ir.exp b/tests/sprint4/expected/sp4_cg_mult.ir.exp index c125e68..12ec01d 100644 --- a/tests/sprint4/expected/sp4_cg_mult.ir.exp +++ b/tests/sprint4/expected/sp4_cg_mult.ir.exp @@ -1,8 +1,12 @@ - 1: func : test - 2: $t0 = 1 - 3: y = $t0 - 4: $t1 = 3 - 5: x = $t1 - 6: $t2 = x * x - 7: y = $t2 - 8: return : y + 1: func_dec : entry + 2: func : entry + 3: $t0 = 3 + 4: x = $t0 + 5: $t1 = 20 + 6: y = $t1 + 7: $t2 = x * y + 8: y = $t2 + 9: param y + 10: call : printInteger 1 + 11: result = $t3 + 12: return : y diff --git a/tests/sprint4/expected/sp4_cg_mult.s.exp b/tests/sprint4/expected/sp4_cg_mult.s.exp index 20b0a57..019a840 100644 --- a/tests/sprint4/expected/sp4_cg_mult.s.exp +++ b/tests/sprint4/expected/sp4_cg_mult.s.exp @@ -1,11 +1,25 @@ - movl $1, -4(%rbp) #constant assign - movl -4(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end +.globl entry +entry: + pushq %rbp + movq %rsp, %rbp + subq $400, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end movl $3, -12(%rbp) #constant assign movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end - movl -16(%rbp), %eax #multiplication start - imull -16(%rbp), %eax - movl %eax, -20(%rbp) #multiplication end + movl $20, -20(%rbp) #constant assign movl -20(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end + movl %eax, -24(%rbp) #assign end + movl -16(%rbp), %eax #multiplication start + imull -24(%rbp), %eax + movl %eax, -28(%rbp) #multiplication end + movl -28(%rbp), %eax #assign start + movl %eax, -24(%rbp) #assign end + movl -24(%rbp), %edi #adding param start + call printInteger + movl %eax, -32(%rbp) #store return from call + movl -32(%rbp), %eax #assign start + movl %eax, -36(%rbp) #assign end + movl -24(%rbp), %eax #return y + leave + ret diff --git a/tests/sprint4/expected/sp4_cg_neg.asc.exp b/tests/sprint4/expected/sp4_cg_neg.asc.exp index 647d812..701f487 100644 --- a/tests/sprint4/expected/sp4_cg_neg.asc.exp +++ b/tests/sprint4/expected/sp4_cg_neg.asc.exp @@ -1,9 +1,46 @@ -001: type main: integer -> integer -002: function test: main -003: -004: test (a) := { -005: [integer:x; integer:y] -006: x := 3; -007: y := -x; -008: return y; -009: } \ No newline at end of file +001: +002: type string: 1 -> character +003: type BooleanXBoolean: [Boolean: x; Boolean: y] +004: type characterXcharacter: [character: x; character: y] +005: type integerXinteger: [integer: x; integer: y] +006: +007: type Boolean2Boolean: Boolean -> Boolean +008: type integer2integer: integer -> integer +009: type character2integer: character -> integer +010: type Boolean2integer: Boolean -> integer +011: type string2integer: string -> integer +012: type integerXinteger2integer: integerXinteger -> integer +013: type integerXinteger2Boolean: integerXinteger -> Boolean +014: type characterXcharacter2Boolean: characterXcharacter -> Boolean +015: type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +016: type integer2address: integer -> address +017: type address2integer: address -> integer +018: type integer2string: integer -> string +019: type integer2character: integer -> character +020: type integer2Boolean: integer -> Boolean +021: +022: +023: external function printInteger: integer2integer +024: external function printCharacter: character2integer +025: external function printBoolean: Boolean2integer +026: +027: external function printS: string2integer +028: external function printI: integer2integer +029: external function printC: character2integer +030: external function printB: Boolean2integer +031: +032: external function inS: integer2string +033: external function inI: integer2integer +034: external function inC: integer2character +035: +036: function entry: string2integer +037: +038: entry (arg) := { +039: [integer:x; integer:y; integer: result] +040: +041: x := 3; +042: y := -x; +043: +044: result := printInteger(y); +045: return y; +046: } \ No newline at end of file diff --git a/tests/sprint4/expected/sp4_cg_neg.ir.exp b/tests/sprint4/expected/sp4_cg_neg.ir.exp index 6a42a7c..88e0fc4 100644 --- a/tests/sprint4/expected/sp4_cg_neg.ir.exp +++ b/tests/sprint4/expected/sp4_cg_neg.ir.exp @@ -1,6 +1,10 @@ - 1: func : test - 2: $t0 = 3 - 3: x = $t0 - 4: $t1 = -x - 5: y = $t1 - 6: return : y + 1: func_dec : entry + 2: func : entry + 3: $t0 = 3 + 4: x = $t0 + 5: $t1 = -x + 6: y = $t1 + 7: param y + 8: call : printInteger 1 + 9: result = $t2 + 10: return : y diff --git a/tests/sprint4/expected/sp4_cg_neg.s.exp b/tests/sprint4/expected/sp4_cg_neg.s.exp index 5f61770..6e92063 100644 --- a/tests/sprint4/expected/sp4_cg_neg.s.exp +++ b/tests/sprint4/expected/sp4_cg_neg.s.exp @@ -1,8 +1,22 @@ - movl $3, -4(%rbp) #constant assign - movl -4(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end - movl -8(%rbp), %eax #negation start - negl %eax - movl %eax, -12(%rbp) #negation end +.globl entry +entry: + pushq %rbp + movq %rsp, %rbp + subq $400, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $3, -12(%rbp) #constant assign movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end + movl -16(%rbp), %eax #negation start + negl %eax + movl %eax, -20(%rbp) #negation end + movl -20(%rbp), %eax #assign start + movl %eax, -24(%rbp) #assign end + movl -24(%rbp), %edi #adding param start + call printInteger + movl %eax, -28(%rbp) #store return from call + movl -28(%rbp), %eax #assign start + movl %eax, -32(%rbp) #assign end + movl -24(%rbp), %eax #return y + leave + ret diff --git a/tests/sprint4/expected/sp4_cg_not.asc.exp b/tests/sprint4/expected/sp4_cg_not.asc.exp index ac22520..634b5f6 100644 --- a/tests/sprint4/expected/sp4_cg_not.asc.exp +++ b/tests/sprint4/expected/sp4_cg_not.asc.exp @@ -1,9 +1,46 @@ -001: type main: integer -> integer -002: function test: main -003: -004: test (a) := { -005: [Boolean: c; Boolean: d] -006: c := true; -007: d := !c; -008: return 1; -009: } \ No newline at end of file +001: +002: type string: 1 -> character +003: type BooleanXBoolean: [Boolean: x; Boolean: y] +004: type characterXcharacter: [character: x; character: y] +005: type integerXinteger: [integer: x; integer: y] +006: +007: type Boolean2Boolean: Boolean -> Boolean +008: type integer2integer: integer -> integer +009: type character2integer: character -> integer +010: type Boolean2integer: Boolean -> integer +011: type string2integer: string -> integer +012: type integerXinteger2integer: integerXinteger -> integer +013: type integerXinteger2Boolean: integerXinteger -> Boolean +014: type characterXcharacter2Boolean: characterXcharacter -> Boolean +015: type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +016: type integer2address: integer -> address +017: type address2integer: address -> integer +018: type integer2string: integer -> string +019: type integer2character: integer -> character +020: type integer2Boolean: integer -> Boolean +021: +022: +023: external function printInteger: integer2integer +024: external function printCharacter: character2integer +025: external function printBoolean: Boolean2integer +026: +027: external function printS: string2integer +028: external function printI: integer2integer +029: external function printC: character2integer +030: external function printB: Boolean2integer +031: +032: external function inS: integer2string +033: external function inI: integer2integer +034: external function inC: integer2character +035: +036: function entry: string2integer +037: +038: entry (arg) := { +039: [Boolean: c; Boolean: d; integer: result] +040: +041: c := true; +042: d := !c; +043: +044: result := printBoolean(d); +045: return 1; +046: } \ No newline at end of file diff --git a/tests/sprint4/expected/sp4_cg_not.ir.exp b/tests/sprint4/expected/sp4_cg_not.ir.exp index f1b6d6b..eb3abe9 100644 --- a/tests/sprint4/expected/sp4_cg_not.ir.exp +++ b/tests/sprint4/expected/sp4_cg_not.ir.exp @@ -1,7 +1,12 @@ - 1: func : test - 2: $t0 = true - 3: c = $t0 - 4: $t1 = !c - 5: d = $t1 - 6: $t2 = 1 - 7: return : $t2 + 1: func_dec : entry + 2: func : entry + 3: $t0 = true + 4: Label : 1 + 5: c = $t0 + 6: Label : 2 + 7: d = $t1 + 8: param d + 9: call : printBoolean 1 + 10: result = $t2 + 11: $t3 = 1 + 12: return : $t3 diff --git a/tests/sprint4/expected/sp4_cg_not.s.exp b/tests/sprint4/expected/sp4_cg_not.s.exp index 39c04ce..8739ed0 100644 --- a/tests/sprint4/expected/sp4_cg_not.s.exp +++ b/tests/sprint4/expected/sp4_cg_not.s.exp @@ -1,13 +1,20 @@ - movl $-1, -1(%rbp) #constant assign - movl -1(%rbp), %eax #assign start - movl %eax, -2(%rbp) #assign end - movzbl -2(%rbp), %eax #not start - testl %eax, %eax - setne %al - xorl $1, %eax - movzbl %al, %eax - movb %al, -3(%rbp) - andb $1, -3(%rbp) #not end - movl -3(%rbp), %eax #assign start - movl %eax, -4(%rbp) #assign end - movl $1, -8(%rbp) #constant assign +.globl entry +entry: + pushq %rbp + movq %rsp, %rbp + subq $400, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $1, -9(%rbp) #constant assign +.L1: + movl -9(%rbp), %eax #assign start + movl %eax, -10(%rbp) #assign end +.L2: + movl -11(%rbp), %edi #adding param start + call printBoolean + movl %eax, -18(%rbp) #store return from call + movl -18(%rbp), %eax #assign start + movl %eax, -24(%rbp) #assign end + movl $1, -28(%rbp) #constant assign + movl -28(%rbp), %eax #return $t3 + leave + ret diff --git a/tests/sprint4/expected/sp4_cg_or.asc.exp b/tests/sprint4/expected/sp4_cg_or.asc.exp index 5a99180..44414e0 100644 --- a/tests/sprint4/expected/sp4_cg_or.asc.exp +++ b/tests/sprint4/expected/sp4_cg_or.asc.exp @@ -1,10 +1,47 @@ -001: type main: integer -> integer -002: function test: main -003: -004: test (a) := { -005: [Boolean:b; Boolean: c; Boolean: d] -006: c := true; -007: d := false; -008: d := c | d; -009: return 1; -010: } \ No newline at end of file +001: +002: type string: 1 -> character +003: type BooleanXBoolean: [Boolean: x; Boolean: y] +004: type characterXcharacter: [character: x; character: y] +005: type integerXinteger: [integer: x; integer: y] +006: +007: type Boolean2Boolean: Boolean -> Boolean +008: type integer2integer: integer -> integer +009: type character2integer: character -> integer +010: type Boolean2integer: Boolean -> integer +011: type string2integer: string -> integer +012: type integerXinteger2integer: integerXinteger -> integer +013: type integerXinteger2Boolean: integerXinteger -> Boolean +014: type characterXcharacter2Boolean: characterXcharacter -> Boolean +015: type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +016: type integer2address: integer -> address +017: type address2integer: address -> integer +018: type integer2string: integer -> string +019: type integer2character: integer -> character +020: type integer2Boolean: integer -> Boolean +021: +022: +023: external function printInteger: integer2integer +024: external function printCharacter: character2integer +025: external function printBoolean: Boolean2integer +026: +027: external function printS: string2integer +028: external function printI: integer2integer +029: external function printC: character2integer +030: external function printB: Boolean2integer +031: +032: external function inS: integer2string +033: external function inI: integer2integer +034: external function inC: integer2character +035: +036: function entry: string2integer +037: +038: entry (arg) := { +039: [Boolean:b; Boolean: c; Boolean: d; integer: result] +040: +041: c := true; +042: d := false; +043: d := c | d; +044: +045: result := printBoolean(d); +046: return 1; +047: } \ No newline at end of file diff --git a/tests/sprint4/expected/sp4_cg_or.ir.exp b/tests/sprint4/expected/sp4_cg_or.ir.exp index 5dfac99..4470879 100644 --- a/tests/sprint4/expected/sp4_cg_or.ir.exp +++ b/tests/sprint4/expected/sp4_cg_or.ir.exp @@ -1,9 +1,22 @@ - 1: func : test - 2: $t0 = true - 3: c = $t0 - 4: $t1 = false - 5: d = $t1 - 6: $t2 = c | d - 7: d = $t2 - 8: $t3 = 1 - 9: return : $t3 + 1: func_dec : entry + 2: func : entry + 3: $t0 = true + 4: Label : 1 + 5: c = $t0 + 6: $t1 = false + 7: Label : 2 + 8: d = $t1 + 9: $t2 = true + 10: if c True GOTO 4 + 11: GOTO : 3 + 12: Label : 3 + 13: if d True GOTO 4 + 14: $t2 = false + 15: GOTO : 4 + 16: Label : 4 + 17: d = $t2 + 18: param d + 19: call : printBoolean 1 + 20: result = $t3 + 21: $t4 = 1 + 22: return : $t4 diff --git a/tests/sprint4/expected/sp4_cg_or.s.exp b/tests/sprint4/expected/sp4_cg_or.s.exp index 7faecdd..1ca0a6a 100644 --- a/tests/sprint4/expected/sp4_cg_or.s.exp +++ b/tests/sprint4/expected/sp4_cg_or.s.exp @@ -1,21 +1,35 @@ - movl $-1, -1(%rbp) #constant assign - movl -1(%rbp), %eax #assign start - movl %eax, -2(%rbp) #assign end - movl $-1, -3(%rbp) #constant assign - movl -3(%rbp), %eax #assign start - movl %eax, -4(%rbp) #assign end - cmpl $0, -2(%rbp) #start or - jne .L1or2 - cmpl $0, -4(%rbp) - je .L1or3 -.L1or2: - movl $1, %eax - jmp .L1or4 -.L1or3: - movl $0, %eax -.L1or4: - movb %al, -5(%rbp) - andb $1, -5(%rbp) #or end - movl -5(%rbp), %eax #assign start - movl %eax, -4(%rbp) #assign end +.globl entry +entry: + pushq %rbp + movq %rsp, %rbp + subq $416, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end movl $1, -9(%rbp) #constant assign +.L1: + movl -9(%rbp), %eax #assign start + movl %eax, -10(%rbp) #assign end + movl $0, -11(%rbp) #constant assign +.L2: + movl -11(%rbp), %eax #assign start + movl %eax, -12(%rbp) #assign end + movl $1, -13(%rbp) #constant assign + cmpb $0, -10(%rbp) #if true start + jne .L4 #if true end + jmp .L3 +.L3: + cmpb $0, -12(%rbp) #if true start + jne .L4 #if true end + movl $0, -13(%rbp) #constant assign + jmp .L4 +.L4: + movl -13(%rbp), %eax #assign start + movl %eax, -12(%rbp) #assign end + movl -12(%rbp), %edi #adding param start + call printBoolean + movl %eax, -18(%rbp) #store return from call + movl -18(%rbp), %eax #assign start + movl %eax, -24(%rbp) #assign end + movl $1, -28(%rbp) #constant assign + movl -28(%rbp), %eax #return $t4 + leave + ret diff --git a/tests/sprint4/expected/sp4_cg_sub.asc.exp b/tests/sprint4/expected/sp4_cg_sub.asc.exp index 4b4496c..8726fb3 100644 --- a/tests/sprint4/expected/sp4_cg_sub.asc.exp +++ b/tests/sprint4/expected/sp4_cg_sub.asc.exp @@ -1,10 +1,47 @@ -001: type main: integer -> integer -002: function test: main -003: -004: test (a) := { -005: [integer:x; integer:y] -006: y := 1; -007: x := 3; -008: y := x - y; -009: return y; -010: } \ No newline at end of file +001: +002: type string: 1 -> character +003: type BooleanXBoolean: [Boolean: x; Boolean: y] +004: type characterXcharacter: [character: x; character: y] +005: type integerXinteger: [integer: x; integer: y] +006: +007: type Boolean2Boolean: Boolean -> Boolean +008: type integer2integer: integer -> integer +009: type character2integer: character -> integer +010: type Boolean2integer: Boolean -> integer +011: type string2integer: string -> integer +012: type integerXinteger2integer: integerXinteger -> integer +013: type integerXinteger2Boolean: integerXinteger -> Boolean +014: type characterXcharacter2Boolean: characterXcharacter -> Boolean +015: type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +016: type integer2address: integer -> address +017: type address2integer: address -> integer +018: type integer2string: integer -> string +019: type integer2character: integer -> character +020: type integer2Boolean: integer -> Boolean +021: +022: +023: external function printInteger: integer2integer +024: external function printCharacter: character2integer +025: external function printBoolean: Boolean2integer +026: +027: external function printS: string2integer +028: external function printI: integer2integer +029: external function printC: character2integer +030: external function printB: Boolean2integer +031: +032: external function inS: integer2string +033: external function inI: integer2integer +034: external function inC: integer2character +035: +036: function entry: string2integer +037: +038: entry (arg) := { +039: [integer:x; integer:y; integer: result] +040: +041: y := 1; +042: x := 3; +043: y := x - y; +044: +045: result := printInteger(y); +046: return y; +047: } \ No newline at end of file diff --git a/tests/sprint4/expected/sp4_cg_sub.ir.exp b/tests/sprint4/expected/sp4_cg_sub.ir.exp index c4ef79a..468b1eb 100644 --- a/tests/sprint4/expected/sp4_cg_sub.ir.exp +++ b/tests/sprint4/expected/sp4_cg_sub.ir.exp @@ -1,8 +1,12 @@ - 1: func : test - 2: $t0 = 1 - 3: y = $t0 - 4: $t1 = 3 - 5: x = $t1 - 6: $t2 = x - y - 7: y = $t2 - 8: return : y + 1: func_dec : entry + 2: func : entry + 3: $t0 = 1 + 4: y = $t0 + 5: $t1 = 3 + 6: x = $t1 + 7: $t2 = x - y + 8: y = $t2 + 9: param y + 10: call : printInteger 1 + 11: result = $t3 + 12: return : y diff --git a/tests/sprint4/expected/sp4_cg_sub.s.exp b/tests/sprint4/expected/sp4_cg_sub.s.exp index 743ef59..8f2c60e 100644 --- a/tests/sprint4/expected/sp4_cg_sub.s.exp +++ b/tests/sprint4/expected/sp4_cg_sub.s.exp @@ -1,11 +1,25 @@ - movl $1, -4(%rbp) #constant assign - movl -4(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end - movl $3, -12(%rbp) #constant assign +.globl entry +entry: + pushq %rbp + movq %rsp, %rbp + subq $400, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $1, -12(%rbp) #constant assign movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end - movl -16(%rbp), %eax #subtraction start - subl -8(%rbp), %eax - movl %eax, -20(%rbp) #subtraction end + movl $3, -20(%rbp) #constant assign movl -20(%rbp), %eax #assign start - movl %eax, -8(%rbp) #assign end + movl %eax, -24(%rbp) #assign end + movl -24(%rbp), %eax #subtraction start + subl -16(%rbp), %eax + movl %eax, -28(%rbp) #subtraction end + movl -28(%rbp), %eax #assign start + movl %eax, -16(%rbp) #assign end + movl -16(%rbp), %edi #adding param start + call printInteger + movl %eax, -32(%rbp) #store return from call + movl -32(%rbp), %eax #assign start + movl %eax, -36(%rbp) #assign end + movl -16(%rbp), %eax #return y + leave + ret diff --git a/tests/sprint4/test/sp4_cg_add.alpha b/tests/sprint4/test/sp4_cg_add.alpha index 0d5fb5a..1b63c8d 100644 --- a/tests/sprint4/test/sp4_cg_add.alpha +++ b/tests/sprint4/test/sp4_cg_add.alpha @@ -1,7 +1,41 @@ (* TEST: [-asc -tc -cg -ir] *) + +type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character + +function entry: string2integer -#include "std.alpha" - entry (arg) := { [integer:x; integer:y; integer: result] diff --git a/tests/sprint4/test/sp4_cg_and.alpha b/tests/sprint4/test/sp4_cg_and.alpha index a42409b..c4a1d47 100644 --- a/tests/sprint4/test/sp4_cg_and.alpha +++ b/tests/sprint4/test/sp4_cg_and.alpha @@ -1,6 +1,40 @@ (* TEST: [-asc -tc -cg -ir] *) -#include "std.alpha" +type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character + +function entry: string2integer entry (arg) := { [Boolean:b; Boolean: c; Boolean: d; integer: result] diff --git a/tests/sprint4/test/sp4_cg_calls.alpha b/tests/sprint4/test/sp4_cg_calls.alpha index 45a1512..ab70dbc 100644 --- a/tests/sprint4/test/sp4_cg_calls.alpha +++ b/tests/sprint4/test/sp4_cg_calls.alpha @@ -1,18 +1,44 @@ (* TEST: [-asc -tc -cg -ir] *) -#include "std.alpha" -(* Standard Alpha Library - Provided by Carl *) - type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character + function entry: string2integer - type rec: [integer: x; integer: y; integer: z; integer: a; integer: b; integer: c; integer: d] - type T2: rec -> integer type T: integer -> integer -type main: string -> integer -function entry: main function bar: T2 function ahh: T @@ -27,8 +53,9 @@ bar (a, b, c,d,e,f,g) := { } entry (arg) := { - [integer:x; integer:y; integer: result] - + [integer:x; integer:y; integer: result; character: a] + a := 'a'; + x := printCharacter(a); result := bar(1,2,3,4,5,6,7); return 1; } diff --git a/tests/sprint4/test/sp4_cg_div.alpha b/tests/sprint4/test/sp4_cg_div.alpha index 39d5a83..097b978 100644 --- a/tests/sprint4/test/sp4_cg_div.alpha +++ b/tests/sprint4/test/sp4_cg_div.alpha @@ -1,6 +1,40 @@ (* TEST: [-asc -tc -cg -ir] *) -#include "std.alpha" +type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character + +function entry: string2integer entry (arg) := { [integer:x; integer:y; integer: result] diff --git a/tests/sprint4/test/sp4_cg_equal_to.alpha b/tests/sprint4/test/sp4_cg_equal_to.alpha index a2823cc..1baae8e 100644 --- a/tests/sprint4/test/sp4_cg_equal_to.alpha +++ b/tests/sprint4/test/sp4_cg_equal_to.alpha @@ -1,6 +1,40 @@ (* TEST: [-asc -tc -cg -ir] *) -#include "std.alpha" +type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character + +function entry: string2integer entry (arg) := { [Boolean: b; integer: x; integer: y; integer: result] diff --git a/tests/sprint4/test/sp4_cg_fib.alpha b/tests/sprint4/test/sp4_cg_fib.alpha deleted file mode 100644 index df740d1..0000000 --- a/tests/sprint4/test/sp4_cg_fib.alpha +++ /dev/null @@ -1,34 +0,0 @@ -(* TEST: [-asc -tc -cg -ir] *) - -#include "std.alpha" - - -type M : string -> integer -function entry : M - -type fib: integer -> integer -function Fib : fib - -Fib(i) := { - [ Boolean: a ; Boolean: b ; Boolean: c] - if( i = 0 ) then { - return 7; - } else { - i := i; - } - b := b | (a & c); - b := 2 < 3; - if(i = 1) then { - return 1; - } else { - return i + Fib(i - 1); - } -} - -entry (arg) := { - [ integer: x; integer: y ] - x := 2; - x := Fib(2); - y := printInteger(Fib(2)); - return 1; -} diff --git a/tests/sprint4/test/sp4_cg_less_than.alpha b/tests/sprint4/test/sp4_cg_less_than.alpha index 77867ab..86ce4b7 100644 --- a/tests/sprint4/test/sp4_cg_less_than.alpha +++ b/tests/sprint4/test/sp4_cg_less_than.alpha @@ -1,6 +1,40 @@ (* TEST: [-asc -tc -cg -ir] *) -#include "std.alpha" +type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character + +function entry: string2integer entry (arg) := { [Boolean: b; integer: x; integer: y; integer: result] diff --git a/tests/sprint4/test/sp4_cg_mod.alpha b/tests/sprint4/test/sp4_cg_mod.alpha index fbd40d5..c405ec4 100644 --- a/tests/sprint4/test/sp4_cg_mod.alpha +++ b/tests/sprint4/test/sp4_cg_mod.alpha @@ -1,6 +1,40 @@ (* TEST: [-asc -tc -cg -ir] *) -#include "std.alpha" +type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character + +function entry: string2integer entry (arg) := { [integer:x; integer:y; integer: result] diff --git a/tests/sprint4/test/sp4_cg_mult.alpha b/tests/sprint4/test/sp4_cg_mult.alpha index 28e7ab6..157ba35 100644 --- a/tests/sprint4/test/sp4_cg_mult.alpha +++ b/tests/sprint4/test/sp4_cg_mult.alpha @@ -1,6 +1,40 @@ (* TEST: [-asc -tc -cg -ir] *) -#include "std.alpha" +type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character + +function entry: string2integer entry (arg) := { [integer:x; integer:y; integer: result] diff --git a/tests/sprint4/test/sp4_cg_neg.alpha b/tests/sprint4/test/sp4_cg_neg.alpha index 2ffe34a..bae60fa 100644 --- a/tests/sprint4/test/sp4_cg_neg.alpha +++ b/tests/sprint4/test/sp4_cg_neg.alpha @@ -1,6 +1,40 @@ (* TEST: [-asc -tc -cg -ir] *) -#include "std.alpha" +type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character + +function entry: string2integer entry (arg) := { [integer:x; integer:y; integer: result] diff --git a/tests/sprint4/test/sp4_cg_not.alpha b/tests/sprint4/test/sp4_cg_not.alpha index 6811471..1fd4ca4 100644 --- a/tests/sprint4/test/sp4_cg_not.alpha +++ b/tests/sprint4/test/sp4_cg_not.alpha @@ -1,6 +1,40 @@ (* TEST: [-asc -tc -cg -ir] *) -#include "std.alpha" +type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character + +function entry: string2integer entry (arg) := { [Boolean: c; Boolean: d; integer: result] diff --git a/tests/sprint4/test/sp4_cg_or.alpha b/tests/sprint4/test/sp4_cg_or.alpha index 61392c2..6ecac00 100644 --- a/tests/sprint4/test/sp4_cg_or.alpha +++ b/tests/sprint4/test/sp4_cg_or.alpha @@ -1,6 +1,40 @@ (* TEST: [-asc -tc -cg -ir] *) -#include "std.alpha" +type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character + +function entry: string2integer entry (arg) := { [Boolean:b; Boolean: c; Boolean: d; integer: result] diff --git a/tests/sprint4/test/sp4_cg_sub.alpha b/tests/sprint4/test/sp4_cg_sub.alpha index 4b60e57..43420bb 100644 --- a/tests/sprint4/test/sp4_cg_sub.alpha +++ b/tests/sprint4/test/sp4_cg_sub.alpha @@ -1,6 +1,40 @@ (* TEST: [-asc -tc -cg -ir] *) -#include "std.alpha" +type string: 1 -> character +type BooleanXBoolean: [Boolean: x; Boolean: y] +type characterXcharacter: [character: x; character: y] +type integerXinteger: [integer: x; integer: y] + +type Boolean2Boolean: Boolean -> Boolean +type integer2integer: integer -> integer +type character2integer: character -> integer +type Boolean2integer: Boolean -> integer +type string2integer: string -> integer +type integerXinteger2integer: integerXinteger -> integer +type integerXinteger2Boolean: integerXinteger -> Boolean +type characterXcharacter2Boolean: characterXcharacter -> Boolean +type BooleanXBoolean2Boolean: BooleanXBoolean -> Boolean +type integer2address: integer -> address +type address2integer: address -> integer +type integer2string: integer -> string +type integer2character: integer -> character +type integer2Boolean: integer -> Boolean + + +external function printInteger: integer2integer +external function printCharacter: character2integer +external function printBoolean: Boolean2integer + +external function printS: string2integer +external function printI: integer2integer +external function printC: character2integer +external function printB: Boolean2integer + +external function inS: integer2string +external function inI: integer2integer +external function inC: integer2character + +function entry: string2integer entry (arg) := { [integer:x; integer:y; integer: result] diff --git a/tests/sprint4/test/sp4_tc_arrays.alpha b/tests/sprint4/test/sp4_tc_arrays.alpha deleted file mode 100644 index 19a31de..0000000 --- a/tests/sprint4/test/sp4_tc_arrays.alpha +++ /dev/null @@ -1,27 +0,0 @@ -type string: 1 -> character -type a_of_s: 1 -> string -type main: integer -> integer -function entry: main - -(* maybe some other type definitions *) - -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'; - another_name(1) := 'a'; - another_name(2) := 'r'; - another_name(3) := 'l'; - many_names := reserve many_names(3); - many_names(0) := one_name; - many_names(1) := another_name; - many_names(2) := reserve many_names(2)(6); (* reserve space for an item of the same type as a_of_s(2), an array of character, with 6 members *) - many_names(2)(0) := 'P'; - many_names(2)(1) := 'a'; - many_names(2)(2) := 'r'; - many_names(2)(3) := 't'; - many_names(2)(4) := 'h'; - many_names(2)(5) := 'o'; - return 0; -} \ No newline at end of file