From 596434e152b9fbba1f07d05560dea89eafa9b222 Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 15:21:36 -0400 Subject: [PATCH 01/30] shtuff --- genx.sh | 1 + library/alphastdio.c | 61 +++++++++ library/std.alpha | 15 ++- library/std.s | 273 +++++++++++++++++++++++++++++++++++++++ tests/programs/fib.alpha | 2 +- tests/programs/io.alpha | 18 +++ 6 files changed, 367 insertions(+), 3 deletions(-) create mode 100644 library/alphastdio.c create mode 100644 library/std.s create mode 100644 tests/programs/io.alpha diff --git a/genx.sh b/genx.sh index 5bbb6f9..7025bd0 100755 --- a/genx.sh +++ b/genx.sh @@ -25,6 +25,7 @@ sToInclude=() cToBuild=() sToInclude+=("library/alpha_lib_reg.s") sToInclude+=("library/alpha_driver.s") +sToInclude+=("library/std.s") filename="" s_name="" 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/std.alpha b/library/std.alpha index a2fc025..2d0f1a9 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 \ No newline at end of file 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/tests/programs/fib.alpha b/tests/programs/fib.alpha index 2f33e06..b136295 100644 --- a/tests/programs/fib.alpha +++ b/tests/programs/fib.alpha @@ -1 +1 @@ -(* TODO: Prints out fib sequence. *) \ No newline at end of file +(* TODO *) \ No newline at end of file diff --git a/tests/programs/io.alpha b/tests/programs/io.alpha new file mode 100644 index 0000000..eac7b03 --- /dev/null +++ b/tests/programs/io.alpha @@ -0,0 +1,18 @@ +#include "std.alpha" + +function entry: string2integer + +entry (arg) := { + [integer: x; string: s; character: c; integer: result] + + s := inS(1); + result := printS(s); + + x := inI(1); + result := printI(x); + + c := inC(1); + result := printC(c); + + return 0; +} \ No newline at end of file From c8491b62e42879d4423084321afc478d78f07d0e Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 15:34:55 -0400 Subject: [PATCH 02/30] psuh --- tests/programs/fib.alpha | 31 ++++++++- tests/programs/io.alpha | 2 + tests/sprint4/expected/sp4_cg_add.asc.exp | 57 ++++++++++++--- tests/sprint4/expected/sp4_cg_add.ir.exp | 24 ++++--- tests/sprint4/expected/sp4_cg_add.s.exp | 36 +++++++--- tests/sprint4/expected/sp4_cg_and.asc.exp | 60 +++++++++++++--- tests/sprint4/expected/sp4_cg_calls.asc.exp | 60 ++++++++++++++++ tests/sprint4/expected/sp4_cg_calls.ir.exp | 37 ++++++++++ tests/sprint4/expected/sp4_cg_calls.s.exp | 69 +++++++++++++++++++ tests/sprint4/expected/sp4_cg_div.asc.exp | 57 ++++++++++++--- tests/sprint4/expected/sp4_cg_div.ir.exp | 24 ++++--- tests/sprint4/expected/sp4_cg_div.s.exp | 34 ++++++--- .../sprint4/expected/sp4_cg_equal_to.asc.exp | 57 ++++++++++++--- tests/sprint4/expected/sp4_cg_equal_to.ir.exp | 27 +++++--- tests/sprint4/expected/sp4_cg_equal_to.s.exp | 36 +++++++--- .../sprint4/expected/sp4_cg_less_than.asc.exp | 57 ++++++++++++--- .../sprint4/expected/sp4_cg_less_than.ir.exp | 27 +++++--- tests/sprint4/expected/sp4_cg_less_than.s.exp | 36 +++++++--- tests/sprint4/expected/sp4_cg_mod.asc.exp | 57 ++++++++++++--- tests/sprint4/expected/sp4_cg_mod.ir.exp | 24 ++++--- tests/sprint4/expected/sp4_cg_mod.s.exp | 36 +++++++--- tests/sprint4/expected/sp4_cg_mult.asc.exp | 57 ++++++++++++--- tests/sprint4/expected/sp4_cg_mult.ir.exp | 24 ++++--- tests/sprint4/expected/sp4_cg_mult.s.exp | 32 +++++++-- tests/sprint4/expected/sp4_cg_neg.asc.exp | 55 ++++++++++++--- tests/sprint4/expected/sp4_cg_neg.ir.exp | 19 +++-- tests/sprint4/expected/sp4_cg_neg.s.exp | 29 ++++++-- tests/sprint4/expected/sp4_cg_not.asc.exp | 55 ++++++++++++--- tests/sprint4/expected/sp4_cg_not.ir.exp | 20 ++++-- tests/sprint4/expected/sp4_cg_not.s.exp | 34 +++++---- tests/sprint4/expected/sp4_cg_or.asc.exp | 57 ++++++++++++--- tests/sprint4/expected/sp4_cg_or.ir.exp | 33 ++++++--- tests/sprint4/expected/sp4_cg_or.s.exp | 52 ++++++++------ tests/sprint4/expected/sp4_cg_sub.asc.exp | 57 ++++++++++++--- tests/sprint4/expected/sp4_cg_sub.ir.exp | 24 ++++--- tests/sprint4/expected/sp4_cg_sub.s.exp | 34 ++++++--- tests/sprint4/test/sp4_cg_add.alpha | 36 +++++++++- tests/sprint4/test/sp4_cg_and.alpha | 36 +++++++++- tests/sprint4/test/sp4_cg_calls.alpha | 39 +++++++++-- tests/sprint4/test/sp4_cg_div.alpha | 36 +++++++++- tests/sprint4/test/sp4_cg_equal_to.alpha | 36 +++++++++- tests/sprint4/test/sp4_cg_fib.alpha | 34 --------- tests/sprint4/test/sp4_cg_less_than.alpha | 36 +++++++++- tests/sprint4/test/sp4_cg_mod.alpha | 36 +++++++++- tests/sprint4/test/sp4_cg_mult.alpha | 36 +++++++++- tests/sprint4/test/sp4_cg_neg.alpha | 36 +++++++++- tests/sprint4/test/sp4_cg_not.alpha | 36 +++++++++- tests/sprint4/test/sp4_cg_or.alpha | 36 +++++++++- tests/sprint4/test/sp4_cg_sub.alpha | 36 +++++++++- 49 files changed, 1560 insertions(+), 339 deletions(-) create mode 100644 tests/sprint4/expected/sp4_cg_calls.asc.exp create mode 100644 tests/sprint4/expected/sp4_cg_calls.ir.exp create mode 100644 tests/sprint4/expected/sp4_cg_calls.s.exp delete mode 100644 tests/sprint4/test/sp4_cg_fib.alpha diff --git a/tests/programs/fib.alpha b/tests/programs/fib.alpha index b136295..9ebef58 100644 --- a/tests/programs/fib.alpha +++ b/tests/programs/fib.alpha @@ -1 +1,30 @@ -(* TODO *) \ No newline at end of file +(* TEST: [-asc -tc -cg -ir] *) + +#include "std.alpha" + +function entry : string2integer +function Fib : integer2integer + +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/programs/io.alpha b/tests/programs/io.alpha index eac7b03..45b387f 100644 --- a/tests/programs/io.alpha +++ b/tests/programs/io.alpha @@ -5,6 +5,8 @@ function entry: string2integer entry (arg) := { [integer: x; string: s; character: c; integer: result] + result := printS("hello world"); + s := inS(1); result := printS(s); diff --git a/tests/sprint4/expected/sp4_cg_add.asc.exp b/tests/sprint4/expected/sp4_cg_add.asc.exp index bff5d97..c234273 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..73beb15 100644 --- a/tests/sprint4/expected/sp4_cg_add.ir.exp +++ b/tests/sprint4/expected/sp4_cg_add.ir.exp @@ -1,8 +1,16 @@ - 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: Label : 1 + 5: y = $t0 + 6: $t1 = 3 + 7: Label : 2 + 8: x = $t1 + 9: $t2 = x + y + 10: Label : 3 + 11: y = $t2 + 12: param y + 13: call : printInteger 1 + 14: Label : 4 + 15: result = $t3 + 16: return : y diff --git a/tests/sprint4/expected/sp4_cg_add.s.exp b/tests/sprint4/expected/sp4_cg_add.s.exp index 4764400..f58dd79 100644 --- a/tests/sprint4/expected/sp4_cg_add.s.exp +++ b/tests/sprint4/expected/sp4_cg_add.s.exp @@ -1,12 +1,30 @@ - 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 $128, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $1, -12(%rbp) #constant assign +.L1: 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 +.L2: 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 +.L3: + 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 +.L4: + 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..edc0a7a --- /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: +039: type rec: [integer: x; integer: y; integer: z; integer: a; integer: b; integer: c; integer: d] +040: type T2: rec -> integer +041: type T: integer -> integer +042: function bar: T2 +043: function ahh: T +044: +045: ahh (a) := { +046: a := printInteger(a); +047: return -1; +048: } +049: +050: bar (a, b, c,d,e,f,g) := { +051: a := printInteger(g); +052: return b; +053: } +054: +055: entry (arg) := { +056: [integer:x; integer:y; integer: result] +057: +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..2995985 --- /dev/null +++ b/tests/sprint4/expected/sp4_cg_calls.ir.exp @@ -0,0 +1,37 @@ + 1: func_dec : entry + 2: func_dec : bar + 3: func_dec : ahh + 4: func : ahh + 5: param a + 6: call : printInteger 1 + 7: Label : 1 + 8: a = $t0 + 9: $t1 = 1 + 10: $t2 = -$t1 + 11: return : $t2 + 12: func : bar + 13: param g + 14: call : printInteger 1 + 15: Label : 2 + 16: a = $t3 + 17: return : b + 18: func : entry + 19: $t4 = 1 + 20: $t5 = 2 + 21: $t6 = 3 + 22: $t7 = 4 + 23: $t8 = 5 + 24: $t9 = 6 + 25: $t10 = 7 + 26: param $t10 + 27: param $t9 + 28: param $t8 + 29: param $t7 + 30: param $t6 + 31: param $t5 + 32: param $t4 + 33: call : bar 7 + 34: Label : 3 + 35: result = $t11 + 36: $t12 = 1 + 37: return : $t12 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..55b65cb --- /dev/null +++ b/tests/sprint4/expected/sp4_cg_calls.s.exp @@ -0,0 +1,69 @@ +.globl entry +ahh: + pushq %rbp + movq %rsp, %rbp + subq $128, %rsp + movl %edi, -4(%rbp) #FunctionStart1param end + movl -4(%rbp), %edi #adding param start + call printInteger + movl %eax, -8(%rbp) #store return from call +.L1: + 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 $128, %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 +.L2: + 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 $128, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $1, -12(%rbp) #constant assign + movl $2, -16(%rbp) #constant assign + movl $3, -20(%rbp) #constant assign + movl $4, -24(%rbp) #constant assign + movl $5, -28(%rbp) #constant assign + movl $6, -32(%rbp) #constant assign + movl $7, -36(%rbp) #constant assign + movl -36(%rbp), %edi #adding param start + movl -32(%rbp), %esi #adding param start + movl -28(%rbp), %edx #adding param start + movl -24(%rbp), %ecx #adding param start + movl -20(%rbp), %r8d #adding param start + movl -16(%rbp), %r9d #adding param start + movl -12(%rbp), %eax #adding param start + movl %eax, 88(%rbp) #adding param end + call bar + movl %eax, -44(%rbp) #store return from call +.L3: + movl -44(%rbp), %eax #assign start + movl %eax, -48(%rbp) #assign end + movl $1, -52(%rbp) #constant assign + movl -52(%rbp), %eax #return $t12 + 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..f316a19 100644 --- a/tests/sprint4/expected/sp4_cg_div.ir.exp +++ b/tests/sprint4/expected/sp4_cg_div.ir.exp @@ -1,8 +1,16 @@ - 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: Label : 1 + 5: x = $t0 + 6: $t1 = 3 + 7: Label : 2 + 8: y = $t1 + 9: $t2 = x / y + 10: Label : 3 + 11: y = $t2 + 12: param y + 13: call : printInteger 1 + 14: Label : 4 + 15: result = $t3 + 16: return : y diff --git a/tests/sprint4/expected/sp4_cg_div.s.exp b/tests/sprint4/expected/sp4_cg_div.s.exp index 1a71c6e..cc51cef 100644 --- a/tests/sprint4/expected/sp4_cg_div.s.exp +++ b/tests/sprint4/expected/sp4_cg_div.s.exp @@ -1,12 +1,30 @@ - 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 $128, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $24, -12(%rbp) #constant assign +.L1: movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end + movl $3, -20(%rbp) #constant assign +.L2: + 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 +.L3: + 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 +.L4: + 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..d0b9e1c 100644 --- a/tests/sprint4/expected/sp4_cg_equal_to.ir.exp +++ b/tests/sprint4/expected/sp4_cg_equal_to.ir.exp @@ -1,10 +1,17 @@ - 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: Label : 1 + 5: x = $t0 + 6: $t1 = 2 + 7: Label : 2 + 8: y = $t1 + 9: $t2 = x == y + 10: Label : 3 + 11: b = $t2 + 12: param b + 13: call : printBoolean 1 + 14: Label : 4 + 15: result = $t3 + 16: $t4 = 1 + 17: 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..374f095 100644 --- a/tests/sprint4/expected/sp4_cg_equal_to.s.exp +++ b/tests/sprint4/expected/sp4_cg_equal_to.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 $128, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $1, -12(%rbp) #constant assign +.L1: 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 +.L2: + 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 %al, -25(%rbp) #equal to end +.L3: + movl -25(%rbp), %eax #assign start + movl %eax, -26(%rbp) #assign end + movl -26(%rbp), %edi #adding param start + call printBoolean + movl %eax, -30(%rbp) #store return from call +.L4: + movl -30(%rbp), %eax #assign start + movl %eax, -34(%rbp) #assign end + movl $1, -38(%rbp) #constant assign + movl -38(%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..169347b 100644 --- a/tests/sprint4/expected/sp4_cg_less_than.ir.exp +++ b/tests/sprint4/expected/sp4_cg_less_than.ir.exp @@ -1,10 +1,17 @@ - 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: Label : 1 + 5: x = $t0 + 6: $t1 = 2 + 7: Label : 2 + 8: y = $t1 + 9: $t2 = x < y + 10: Label : 3 + 11: b = $t2 + 12: param b + 13: call : printBoolean 1 + 14: Label : 4 + 15: result = $t3 + 16: $t4 = 1 + 17: 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..57c2a33 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 $128, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $1, -12(%rbp) #constant assign +.L1: 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 +.L2: + 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 +.L3: + movl -25(%rbp), %eax #assign start + movl %eax, -26(%rbp) #assign end + movl -26(%rbp), %edi #adding param start + call printBoolean + movl %eax, -30(%rbp) #store return from call +.L4: + movl -30(%rbp), %eax #assign start + movl %eax, -34(%rbp) #assign end + movl $1, -38(%rbp) #constant assign + movl -38(%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..4c2421e 100644 --- a/tests/sprint4/expected/sp4_cg_mod.ir.exp +++ b/tests/sprint4/expected/sp4_cg_mod.ir.exp @@ -1,8 +1,16 @@ - 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: Label : 1 + 5: x = $t0 + 6: $t1 = 20 + 7: Label : 2 + 8: y = $t1 + 9: $t2 = y % x + 10: Label : 3 + 11: y = $t2 + 12: param y + 13: call : printInteger 1 + 14: Label : 4 + 15: result = $t3 + 16: return : y diff --git a/tests/sprint4/expected/sp4_cg_mod.s.exp b/tests/sprint4/expected/sp4_cg_mod.s.exp index 97d4259..85cd9db 100644 --- a/tests/sprint4/expected/sp4_cg_mod.s.exp +++ b/tests/sprint4/expected/sp4_cg_mod.s.exp @@ -1,12 +1,30 @@ - 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 $128, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $4, -12(%rbp) #constant assign +.L1: 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 +.L2: 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 +.L3: + 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 +.L4: + 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..70de136 100644 --- a/tests/sprint4/expected/sp4_cg_mult.ir.exp +++ b/tests/sprint4/expected/sp4_cg_mult.ir.exp @@ -1,8 +1,16 @@ - 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: Label : 1 + 5: x = $t0 + 6: $t1 = 20 + 7: Label : 2 + 8: y = $t1 + 9: $t2 = x * y + 10: Label : 3 + 11: y = $t2 + 12: param y + 13: call : printInteger 1 + 14: Label : 4 + 15: result = $t3 + 16: return : y diff --git a/tests/sprint4/expected/sp4_cg_mult.s.exp b/tests/sprint4/expected/sp4_cg_mult.s.exp index 20b0a57..567acb3 100644 --- a/tests/sprint4/expected/sp4_cg_mult.s.exp +++ b/tests/sprint4/expected/sp4_cg_mult.s.exp @@ -1,11 +1,29 @@ - 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 $128, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end movl $3, -12(%rbp) #constant assign +.L1: 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 +.L2: 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 +.L3: + 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 +.L4: + 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..9bc3442 100644 --- a/tests/sprint4/expected/sp4_cg_neg.ir.exp +++ b/tests/sprint4/expected/sp4_cg_neg.ir.exp @@ -1,6 +1,13 @@ - 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: Label : 1 + 5: x = $t0 + 6: $t1 = -x + 7: Label : 2 + 8: y = $t1 + 9: param y + 10: call : printInteger 1 + 11: Label : 3 + 12: result = $t2 + 13: return : y diff --git a/tests/sprint4/expected/sp4_cg_neg.s.exp b/tests/sprint4/expected/sp4_cg_neg.s.exp index 5f61770..ddf2a63 100644 --- a/tests/sprint4/expected/sp4_cg_neg.s.exp +++ b/tests/sprint4/expected/sp4_cg_neg.s.exp @@ -1,8 +1,25 @@ - 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 $128, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $3, -12(%rbp) #constant assign +.L1: 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 +.L2: + 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 +.L3: + 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..5a9a503 100644 --- a/tests/sprint4/expected/sp4_cg_not.ir.exp +++ b/tests/sprint4/expected/sp4_cg_not.ir.exp @@ -1,7 +1,13 @@ - 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: Label : 3 + 11: result = $t2 + 12: $t3 = 1 + 13: return : $t3 diff --git a/tests/sprint4/expected/sp4_cg_not.s.exp b/tests/sprint4/expected/sp4_cg_not.s.exp index 39c04ce..63b18a5 100644 --- a/tests/sprint4/expected/sp4_cg_not.s.exp +++ b/tests/sprint4/expected/sp4_cg_not.s.exp @@ -1,13 +1,21 @@ - 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 $128, %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, -15(%rbp) #store return from call +.L3: + movl -15(%rbp), %eax #assign start + movl %eax, -19(%rbp) #assign end + movl $1, -23(%rbp) #constant assign + movl -23(%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..0319c40 100644 --- a/tests/sprint4/expected/sp4_cg_or.ir.exp +++ b/tests/sprint4/expected/sp4_cg_or.ir.exp @@ -1,9 +1,24 @@ - 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: Label : 3 + 11: if c True GOTO 5 + 12: GOTO : 4 + 13: Label : 4 + 14: if d True GOTO 5 + 15: $t2 = false + 16: GOTO : 5 + 17: Label : 5 + 18: d = $t2 + 19: param d + 20: call : printBoolean 1 + 21: Label : 6 + 22: result = $t3 + 23: $t4 = 1 + 24: return : $t4 diff --git a/tests/sprint4/expected/sp4_cg_or.s.exp b/tests/sprint4/expected/sp4_cg_or.s.exp index 7faecdd..0493673 100644 --- a/tests/sprint4/expected/sp4_cg_or.s.exp +++ b/tests/sprint4/expected/sp4_cg_or.s.exp @@ -1,21 +1,31 @@ - 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 - movl $1, -9(%rbp) #constant assign +.globl entry +entry: + pushq %rbp + movq %rsp, %rbp + subq $128, %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 $-1, -11(%rbp) #constant assign +.L2: + movl -11(%rbp), %eax #assign start + movl %eax, -12(%rbp) #assign end + movl $-1, -13(%rbp) #constant assign +.L3: +.L4: + movl $-1, -13(%rbp) #constant assign +.L5: + movl -13(%rbp), %eax #assign start + movl %eax, -12(%rbp) #assign end + movl -12(%rbp), %edi #adding param start + call printBoolean + movl %eax, -17(%rbp) #store return from call +.L6: + movl -17(%rbp), %eax #assign start + movl %eax, -21(%rbp) #assign end + movl $1, -25(%rbp) #constant assign + movl -25(%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..23e60d4 100644 --- a/tests/sprint4/expected/sp4_cg_sub.ir.exp +++ b/tests/sprint4/expected/sp4_cg_sub.ir.exp @@ -1,8 +1,16 @@ - 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: Label : 1 + 5: y = $t0 + 6: $t1 = 3 + 7: Label : 2 + 8: x = $t1 + 9: $t2 = x - y + 10: Label : 3 + 11: y = $t2 + 12: param y + 13: call : printInteger 1 + 14: Label : 4 + 15: result = $t3 + 16: return : y diff --git a/tests/sprint4/expected/sp4_cg_sub.s.exp b/tests/sprint4/expected/sp4_cg_sub.s.exp index 743ef59..bc47b9f 100644 --- a/tests/sprint4/expected/sp4_cg_sub.s.exp +++ b/tests/sprint4/expected/sp4_cg_sub.s.exp @@ -1,11 +1,29 @@ - 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 $128, %rsp + movl %edi, -8(%rbp) #FunctionStart1param end + movl $1, -12(%rbp) #constant assign +.L1: 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 +.L2: 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 +.L3: + 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 +.L4: + 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..96e2842 100644 --- a/tests/sprint4/test/sp4_cg_add.alpha +++ b/tests/sprint4/test/sp4_cg_add.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_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..c7beea1 100644 --- a/tests/sprint4/test/sp4_cg_calls.alpha +++ b/tests/sprint4/test/sp4_cg_calls.alpha @@ -1,18 +1,45 @@ (* 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 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] From bab71df5172626182581f3cc77edbd1c0641e87c Mon Sep 17 00:00:00 2001 From: Annie Date: Tue, 6 May 2025 15:53:24 -0400 Subject: [PATCH 03/30] hopefully fixed merge --- library/std.alpha | 2 +- src/codegen.c | 188 +++++++++++++++----------- src/codegen.h | 9 +- src/grammar.h | 2 +- src/intermediate_code.c | 4 + tests/given/test/functionValue.alpha | 6 +- tests/sprint4/test/sp4_cg_add.alpha | 4 +- tests/sprint4/test/sp4_cg_calls.alpha | 6 +- 8 files changed, 135 insertions(+), 86 deletions(-) diff --git a/library/std.alpha b/library/std.alpha index 2d0f1a9..19b278a 100644 --- a/library/std.alpha +++ b/library/std.alpha @@ -32,4 +32,4 @@ external function printB: Boolean2integer external function inS: integer2string external function inI: integer2integer -external function inC: integer2character \ No newline at end of file +external function inC: integer2character diff --git a/src/codegen.c b/src/codegen.c index 492d3df..9de14e7 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -3,92 +3,99 @@ #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); + default:; } i = i->next; } return -1; } +void align(TableNode *tn) { + int size = getPrimSize(getTypeEntry(tn)); + offset += offset % size; +} CGNode *getNextCG(CGNode *cg) { if (cg == NULL) { return NULL; @@ -125,6 +132,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 +140,13 @@ CGNode *addCG(TableNode *tn, int sp) { return cg; } +int generateFunctionDec(Instruction *i) { + FunDecList * fd = calloc(1, sizeof(FunDecList)); + fd->tn = getResult(i); + fd->next = funList; + funList = fd; + return 0; +} int generateLabel(Instruction *inst) { if (inst == NULL) { return -1; @@ -511,7 +526,8 @@ int generateAssign(Instruction *inst) { } int generateGoto(Instruction *inst) { - return -1; + fprintf(cg_flag, "\tjmp\t.L%d\n", getLabel(inst)); + return 0; } int generateCondGoto(Instruction *inst) { @@ -520,7 +536,6 @@ 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 } int generateIfFalse(Instruction *inst) { @@ -621,13 +636,18 @@ int generateCall(Instruction *inst) { return -1; } + //if (findCG(getTN(op1)) == NULL) { + // printdebug("generateFunctionCall failed, function not in stack"); + // return -1; + //} // if (getTN(op2) == NULL) { // printdebug("generateFunctionCall failed, NULL tablenode2"); // return -1; //} fprintf(cg_flag, "\tcall %s\n", getName(getTN(op1))); - + //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"); //now for the return CGNode *cg = findCG(getResult(inst)); @@ -703,6 +723,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)))); @@ -737,7 +758,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 +785,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 +797,18 @@ int generateFunctionStart(Instruction *inst) { } } + if (strcmp(getName(funDecTN), "entry") == 0) { + if (funList == NULL) { + return -1; + } + fprintf(stderr, "here\n"); + TableNode *funDec; + while (funList != NULL) { + funDec = funList->tn; + CGNode *cg = addCG(getResult(inst), offset); + 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..0667445 100644 --- a/src/codegen.h +++ b/src/codegen.h @@ -25,15 +25,21 @@ 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; + 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); @@ -66,3 +72,4 @@ extern Instruction *current; extern int offset; extern int currentsp; extern CGNode *cgList; +extern FunDecList *funList; diff --git a/src/grammar.h b/src/grammar.h index ec850a2..94384d8 100644 --- a/src/grammar.h +++ b/src/grammar.h @@ -31,7 +31,7 @@ Instruction *current; int offset; int currentsp; CGNode *cgList; - +FunDecList *funList; Stack *stack; Stack *TrueList; Stack *FalseList; diff --git a/src/intermediate_code.c b/src/intermediate_code.c index beccafd..f6d4e9b 100644 --- a/src/intermediate_code.c +++ b/src/intermediate_code.c @@ -615,6 +615,10 @@ TableNode *getTN(TNodeOrConst *tnc) { int getConst(TNodeOrConst *tnc) { if (tnc->d == INTEGER) { return tnc->tnc_union->integer; + } else if (tnc->d == CHARACTER) { + return tnc->tnc_union->character; + } else if (tnc->d == BOOLEAN) { + return tnc->tnc_union->Boolean; } return -1; } diff --git a/tests/given/test/functionValue.alpha b/tests/given/test/functionValue.alpha index 8216d9e..aa31fde 100644 --- a/tests/given/test/functionValue.alpha +++ b/tests/given/test/functionValue.alpha @@ -30,7 +30,7 @@ function d: iic2b d(x,y,z) := { [string: s] - return 0; + return true; } function entry: string2int @@ -38,6 +38,7 @@ function entry: string2int a(x) := { [string : s] s := x; + return 0; } @@ -50,7 +51,7 @@ b(x) := { c(x) := { [string: s] s := "Hi!"; - return x(s); + return a(s); } @@ -61,6 +62,7 @@ entry(arg) := { [integer: result; string2int: f; integer: temp] temp := a("Hello"); f := b(temp); + result := f("ahhh"); result := c(f); if (d(1,2,'c')) then { diff --git a/tests/sprint4/test/sp4_cg_add.alpha b/tests/sprint4/test/sp4_cg_add.alpha index 96e2842..1b63c8d 100644 --- a/tests/sprint4/test/sp4_cg_add.alpha +++ b/tests/sprint4/test/sp4_cg_add.alpha @@ -1,5 +1,5 @@ (* TEST: [-asc -tc -cg -ir] *) - + type string: 1 -> character type BooleanXBoolean: [Boolean: x; Boolean: y] type characterXcharacter: [character: x; character: y] @@ -35,7 +35,7 @@ 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_calls.alpha b/tests/sprint4/test/sp4_cg_calls.alpha index c7beea1..ab70dbc 100644 --- a/tests/sprint4/test/sp4_cg_calls.alpha +++ b/tests/sprint4/test/sp4_cg_calls.alpha @@ -36,7 +36,6 @@ 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 @@ -54,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; } From a459cb11120300f50ea4b53c932850dc949e4586 Mon Sep 17 00:00:00 2001 From: Meyer Simon Date: Tue, 6 May 2025 10:07:13 -0400 Subject: [PATCH 04/30] I believe that the backpatching before the and and or are wrong --- src/grammar.y | 13 ++++++++----- tests/sprint3/test/sp3_if_else.alpha | 4 ++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/grammar.y b/src/grammar.y index 3d7db57..104653f 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -617,6 +617,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); @@ -680,7 +681,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)); // ---------------------------------------------------------------------------- @@ -921,8 +924,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){ @@ -974,8 +977,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){ 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; From 88511ac0e6b22813014f0f153088ba3c6a3f1ff2 Mon Sep 17 00:00:00 2001 From: Meyer Simon Date: Tue, 6 May 2025 15:49:31 -0400 Subject: [PATCH 05/30] I added some changes to make offsets work --- src/grammar.y | 8 ++++---- src/intermediate_code.c | 15 +++++++++++---- src/intermediate_code.h | 2 +- src/symbol_table.h | 4 +++- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/grammar.y b/src/grammar.y index 104653f..a94f5dd 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -1466,8 +1466,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); @@ -1475,8 +1477,6 @@ assignable: } printdebug("[ASSIGNABLE - RULE 3] record = name: %s | field = %s", getName((TableNode*)($1)), getName((TableNode*)$3)); } - - ; diff --git a/src/intermediate_code.c b/src/intermediate_code.c index f6d4e9b..e8e065c 100644 --- a/src/intermediate_code.c +++ b/src/intermediate_code.c @@ -345,8 +345,12 @@ void emit_address_of(TableNode *x, TNodeOrConst *y) { current->operand1 = y; } -void emit_field_access(char *result, char *record, char *field) { +void emit_field_access(TableNode *result, TNodeOrConst *record, int offset){ emit_helper(); + current->opcode = E_DEREF_RIGHT; + current->result = result; + current->operand1 = record; + current->operand2 = tn_or_const(INTEGER, &offset); } void emit_array_access(Op op, TableNode *result, TNodeOrConst *array, TNodeOrConst *index) { @@ -587,19 +591,22 @@ void emit_as_file(FILE *out_file, Instruction *i) { getName(i->result), get_string(i->operand1)); break; - case E_DEREF_RIGHT: fprintf(out_file, - "%4.d: %s = *%s\n", + "%4.d: %s = *((char * )%s + %s)\n", i->index, getName(i->result), - get_string(i->operand1)); + get_string(i->operand1), + get_string(i->operand2) + ); + break; case E_DEREF_LEFT: fprintf(out_file, "%4.d: *%s = %s\n", i->index, getName(i->result), get_string(i->operand1)); + break; } emit_as_file(out_file, i->next); diff --git a/src/intermediate_code.h b/src/intermediate_code.h index 5f50828..87e3123 100644 --- a/src/intermediate_code.h +++ b/src/intermediate_code.h @@ -143,7 +143,7 @@ void emit_function_dec(TableNode * name); void emit_return(TNodeOrConst *value); void emit_reserve(TableNode *result, TNodeOrConst *size); void emit_release(TableNode *pointer); -void emit_field_access(char *result, char *record, char *field); +void emit_field_access(TableNode *result, TNodeOrConst *record, int offset); void emit_array_access(Op op, TableNode *result, TNodeOrConst *array, TNodeOrConst *index); void emit_bounds_check(TNodeOrConst *index, TNodeOrConst *arr); void emit_goto(int i); diff --git a/src/symbol_table.h b/src/symbol_table.h index 2a8abb5..5feb46c 100644 --- a/src/symbol_table.h +++ b/src/symbol_table.h @@ -161,6 +161,8 @@ ListOfTable *getRestOfChildren(ListOfTable *lt); TableNode *getFirstEntry(SymbolTable *st); TableNode *getNextEntry(TableNode *tn); TableNode *printTableNode(TableNode *tn); +int getElementOffset(TableNode *rec, char* id); +int getRecPosition(TableNode* rec, char* id); extern int yylex(void); extern char *yytext; @@ -199,4 +201,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; From 5e0d2e3cdff17d331f219b419fa4b03b44710bf8 Mon Sep 17 00:00:00 2001 From: Meyer Simon Date: Tue, 6 May 2025 16:16:56 -0400 Subject: [PATCH 06/30] Neet --- src/intermediate_code.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/intermediate_code.c b/src/intermediate_code.c index e8e065c..2145ea3 100644 --- a/src/intermediate_code.c +++ b/src/intermediate_code.c @@ -190,7 +190,8 @@ void emit_binary_op( Op op, TableNode *result, TNodeOrConst *arg1, - TNodeOrConst *arg2) { + TNodeOrConst *arg2 + ) { emit_helper(); current->opcode = op; // TODO: create temp and remove result from param list From a7e10521d8e6c881f746de0a5d198053af254b8b Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 16:42:22 -0400 Subject: [PATCH 07/30] this --- src/codegen.c | 2 +- src/codegen.h | 1 + src/symbol_table.c | 49 +++++++++++++++++++++++++++++++---------- src/symbol_table.h | 2 ++ tests/programs/io.alpha | 2 -- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 9de14e7..88a2ab1 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -744,7 +744,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 diff --git a/src/codegen.h b/src/codegen.h index 0667445..d790ea9 100644 --- a/src/codegen.h +++ b/src/codegen.h @@ -68,6 +68,7 @@ int generateFunctionStart(Instruction *instruction); extern int label_count; extern Instruction *begin; extern Instruction *current; +extern SymbolTable *top; extern int offset; extern int currentsp; diff --git a/src/symbol_table.c b/src/symbol_table.c index 50c2a39..9f81805 100644 --- a/src/symbol_table.c +++ b/src/symbol_table.c @@ -462,7 +462,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."); @@ -478,25 +478,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."); @@ -512,7 +512,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( @@ -522,11 +522,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 @@ -1739,3 +1739,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; +} \ No newline at end of file diff --git a/src/symbol_table.h b/src/symbol_table.h index 5feb46c..e6da226 100644 --- a/src/symbol_table.h +++ b/src/symbol_table.h @@ -163,12 +163,14 @@ TableNode *getNextEntry(TableNode *tn); TableNode *printTableNode(TableNode *tn); 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; diff --git a/tests/programs/io.alpha b/tests/programs/io.alpha index 45b387f..eac7b03 100644 --- a/tests/programs/io.alpha +++ b/tests/programs/io.alpha @@ -5,8 +5,6 @@ function entry: string2integer entry (arg) := { [integer: x; string: s; character: c; integer: result] - result := printS("hello world"); - s := inS(1); result := printS(s); From 8bba742c99d95435534cce487cecf027d4668cbd Mon Sep 17 00:00:00 2001 From: Annie Date: Tue, 6 May 2025 16:44:26 -0400 Subject: [PATCH 08/30] please dont break --- src/codegen.c | 32 ++++++++++++++++++++++++++++++-- tests/programs/fib.alpha | 5 +++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 88a2ab1..acbf76d 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -535,11 +535,39 @@ int generateCondGoto(Instruction *inst) { } int generateIfTrue(Instruction *inst) { - return -1; + 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, "\tcmpl\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) { diff --git a/tests/programs/fib.alpha b/tests/programs/fib.alpha index 9ebef58..37a86c8 100644 --- a/tests/programs/fib.alpha +++ b/tests/programs/fib.alpha @@ -12,9 +12,10 @@ Fib(i) := { } else { i := i; } - b := b | (a & c); - b := 2 < 3; + (*b := b | (a & c); + b := 2 < 3;*) if(i = 1) then { + i := printCharacter('a'); return 1; } else { return i + Fib(i - 1); From 0a5b6ee7fba6bc1ce2b6d0a82817ca19afc2afb3 Mon Sep 17 00:00:00 2001 From: Annie Date: Tue, 6 May 2025 17:34:00 -0400 Subject: [PATCH 09/30] ifs work --- src/codegen.c | 3 ++- src/intermediate_code.c | 2 ++ tests/programs/fib.alpha | 28 ++++++++++++++++++---------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index acbf76d..3393217 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -548,7 +548,7 @@ int generateIfTrue(Instruction *inst) { return -1; } - fprintf(cg_flag, "\tcmpl\t$0, %d(%%rbp)\t#if true start\n", getAddress(cg)); + 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)); } @@ -642,6 +642,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; } diff --git a/src/intermediate_code.c b/src/intermediate_code.c index 2145ea3..4bbac3e 100644 --- a/src/intermediate_code.c +++ b/src/intermediate_code.c @@ -627,6 +627,8 @@ int getConst(TNodeOrConst *tnc) { return tnc->tnc_union->character; } else if (tnc->d == BOOLEAN) { return tnc->tnc_union->Boolean; + } else if (tnc->d == ADDRESS) { + return 0; } return -1; } diff --git a/tests/programs/fib.alpha b/tests/programs/fib.alpha index 37a86c8..9105a9a 100644 --- a/tests/programs/fib.alpha +++ b/tests/programs/fib.alpha @@ -6,26 +6,34 @@ function entry : string2integer function Fib : integer2integer Fib(i) := { - [ Boolean: a ; Boolean: b ; Boolean: c] - if( i = 0 ) then { + [integer: a; integer: b ; Boolean: d ; integer: c] + (*if( i = 0 ) then { return 7; } else { i := i; - } + }*) (*b := b | (a & c); b := 2 < 3;*) - if(i = 1) then { - i := printCharacter('a'); - return 1; - } else { - return i + Fib(i - 1); + + (* `if(i = 1) then { return 1; } else { + return Fib(i - 1) + Fib(i - 2); } +*) + + a := 0; + b := 1; + while(0 < i) { + c := a + b; + a := b; + b := c; + } + return c; } entry (arg) := { [ integer: x; integer: y ] x := 2; - x := Fib(2); - y := printInteger(Fib(2)); +(* x := Fib(2);*) + y := printInteger(Fib(3)); return 1; } From 96cb2d7a0947a1075c65a786838cc80636d95972 Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 17:34:10 -0400 Subject: [PATCH 10/30] we fixed this woooo --- genx.sh | 2 +- src/lexicalStructure.lex | 35 ++++++++++++++++++++++++++++++++++- tests/programs/io.alpha | 13 +++++++++++-- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/genx.sh b/genx.sh index 7025bd0..aa11527 100755 --- a/genx.sh +++ b/genx.sh @@ -193,7 +193,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/src/lexicalStructure.lex b/src/lexicalStructure.lex index a8bd8af..8413ca3 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;} @@ -81,3 +98,19 @@ _{DIGIT}+ {if(tok_flag != NULL){print_tok(ACCESS);}incr(line_number,colum . { incr(line_number,column_number,0); } %% + +int decode_escape_char(const char *t) { + switch (*t) { + case 'n': + return 0x0A; // \n + case 't': + return 0x09; // \t + case '\\': + return 0x5C; // \\\ + case '\'': + return 0x27; // \' + default: + fprintf(stderr, "(%d:%d) ** LEX ERROR: unknown escape \\%c\n", yylineno, yycolumn, *t); + exit(EXIT_FAILURE); + } +} \ No newline at end of file diff --git a/tests/programs/io.alpha b/tests/programs/io.alpha index eac7b03..ddfb00e 100644 --- a/tests/programs/io.alpha +++ b/tests/programs/io.alpha @@ -5,14 +5,23 @@ function entry: string2integer entry (arg) := { [integer: x; string: s; character: c; integer: result] - s := inS(1); + result := printCharacter('\t'); + result := printCharacter('t'); + result := printCharacter('a'); + result := printCharacter('b'); + result := printCharacter('\n'); + result := printCharacter('\\'); + result := printCharacter('"'); + result := printCharacter('\''); + + (*s := inS(1); result := printS(s); x := inI(1); result := printI(x); c := inC(1); - result := printC(c); + result := printC(c);*) return 0; } \ No newline at end of file From 31db445afd9c7a0a0b6d3fbc7252598092c98f3c Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 17:34:35 -0400 Subject: [PATCH 11/30] wooo --- src/lexicalStructure.lex | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/src/lexicalStructure.lex b/src/lexicalStructure.lex index 8413ca3..bbcacd8 100644 --- a/src/lexicalStructure.lex +++ b/src/lexicalStructure.lex @@ -63,7 +63,7 @@ SCHAR \\n|\\t|\\\"|[^\"\n\\] '{CHAR}' { if (tok_flag) print_tok(C_CHARACTER); incr(line_number, column_number, C_CHARACTER); - +0 int value; if (strcmp(yytext, "'\\n'") == 0) value = 0x0A; else if (strcmp(yytext, "'\\t'") == 0) value = 0x09; @@ -97,20 +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); } -%% - -int decode_escape_char(const char *t) { - switch (*t) { - case 'n': - return 0x0A; // \n - case 't': - return 0x09; // \t - case '\\': - return 0x5C; // \\\ - case '\'': - return 0x27; // \' - default: - fprintf(stderr, "(%d:%d) ** LEX ERROR: unknown escape \\%c\n", yylineno, yycolumn, *t); - exit(EXIT_FAILURE); - } -} \ No newline at end of file +%% \ No newline at end of file From d6803874f9ecabc994dfa4bd6b71f356475d0bfa Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 17:35:19 -0400 Subject: [PATCH 12/30] yes --- src/lexicalStructure.lex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lexicalStructure.lex b/src/lexicalStructure.lex index bbcacd8..a8f4474 100644 --- a/src/lexicalStructure.lex +++ b/src/lexicalStructure.lex @@ -63,7 +63,7 @@ SCHAR \\n|\\t|\\\"|[^\"\n\\] '{CHAR}' { if (tok_flag) print_tok(C_CHARACTER); incr(line_number, column_number, C_CHARACTER); -0 + int value; if (strcmp(yytext, "'\\n'") == 0) value = 0x0A; else if (strcmp(yytext, "'\\t'") == 0) value = 0x09; From a57aaf764a744e4139e84ee9dc56ec2c221bd665 Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 18:10:06 -0400 Subject: [PATCH 13/30] =?UTF-8?q?factorial=20=F0=9F=A6=96=F0=9F=A6=96?= =?UTF-8?q?=F0=9F=A6=96=F0=9F=A6=96=F0=9F=A6=96=F0=9F=A6=96=F0=9F=A6=96?= =?UTF-8?q?=F0=9F=A6=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/programs/factorial.alpha | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tests/programs/factorial.alpha 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 From 44f0e0f5af4a769eee227b77789d5cd48199e346 Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 18:24:43 -0400 Subject: [PATCH 14/30] =?UTF-8?q?=F0=9F=AA=83=F0=9F=AA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- genx.sh | 1 + library/boundscheck.c | 23 +++++++++ library/boundscheck.s | 112 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 library/boundscheck.c create mode 100644 library/boundscheck.s diff --git a/genx.sh b/genx.sh index aa11527..a1a9bd4 100755 --- a/genx.sh +++ b/genx.sh @@ -26,6 +26,7 @@ cToBuild=() sToInclude+=("library/alpha_lib_reg.s") sToInclude+=("library/alpha_driver.s") sToInclude+=("library/std.s") +sToInclude+=("library/boundscheck.s") filename="" s_name="" 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 From 63becc9c1a4ac3b9b283cbc35673c044932a3d4e Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 18:47:18 -0400 Subject: [PATCH 15/30] hello. can u hear me. --- tests/programs/helloworld.alpha | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/tests/programs/helloworld.alpha b/tests/programs/helloworld.alpha index 109cae8..c889222 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 From d340a05b61b6cfd7f4d5c24eae1f44f7ec862aa0 Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 19:10:18 -0400 Subject: [PATCH 16/30] fib --- tests/programs/fib.alpha | 84 ++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 30 deletions(-) diff --git a/tests/programs/fib.alpha b/tests/programs/fib.alpha index 9105a9a..bbc20f9 100644 --- a/tests/programs/fib.alpha +++ b/tests/programs/fib.alpha @@ -1,39 +1,63 @@ -(* TEST: [-asc -tc -cg -ir] *) - #include "std.alpha" function entry : string2integer -function Fib : integer2integer +function fib : integer2integer -Fib(i) := { - [integer: a; integer: b ; Boolean: d ; integer: 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 Fib(i - 1) + Fib(i - 2); - } -*) +fib(i) := { + [ integer: a; integer: b; integer: count ] + + a := 1; + b := 2; - a := 0; - b := 1; - while(0 < i) { - c := a + b; - a := b; - b := c; - } - return c; + if (i = 0) then { + return 0; + } else { + a := a; + } + + if (i = 1) then { + return 1; + } else { + a := a; + } + + if (i = 2) then { + return 2; + } else { + a := a; + } + + count := 2; + while (count < i) { + + count := count + 1; + } + + return b; } entry (arg) := { - [ integer: x; integer: y ] - x := 2; -(* x := Fib(2);*) - y := printInteger(Fib(3)); - return 1; + [ 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; } From 17d6f50904caf8d1557ad89d69add8dc2945492c Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 19:21:35 -0400 Subject: [PATCH 17/30] fib --- tests/programs/fib.alpha | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/tests/programs/fib.alpha b/tests/programs/fib.alpha index bbc20f9..287614b 100644 --- a/tests/programs/fib.alpha +++ b/tests/programs/fib.alpha @@ -4,36 +4,20 @@ function entry : string2integer function fib : integer2integer fib(i) := { - [ integer: a; integer: b; integer: count ] - - a := 1; - b := 2; - if (i = 0) then { + if (i < 1) then { return 0; } else { - a := a; + i := i; } - if (i = 1) then { - return 1; + if (i < 2) then { + return i; } else { - a := a; + i := i; } - if (i = 2) then { - return 2; - } else { - a := a; - } - - count := 2; - while (count < i) { - - count := count + 1; - } - - return b; + return fib(i-1) + fib(i-2); } entry (arg) := { From 05b347ba6324720f5cbbe419d616ad5dfb7d6f29 Mon Sep 17 00:00:00 2001 From: Meyer Simon Date: Tue, 6 May 2025 17:34:46 -0400 Subject: [PATCH 18/30] Hello --- src/intermediate_code.c | 2 +- src/intermediate_code.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/intermediate_code.c b/src/intermediate_code.c index 4bbac3e..3a473a1 100644 --- a/src/intermediate_code.c +++ b/src/intermediate_code.c @@ -316,7 +316,7 @@ void emit_return(TNodeOrConst *value) { void emit_reserve(TableNode *result, TNodeOrConst *size) { // this needs to change // we need to take a int - emit_parameter(size); + emit_binary_op(E_MUL, result, emit_function_call(result, 1, tn_or_const(NODE, look_up(cur, "reserve"))); } 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 From 8c409561b73593a2de04fbf9ed32f6522a7991d5 Mon Sep 17 00:00:00 2001 From: Meyer Simon Date: Tue, 6 May 2025 19:35:49 -0400 Subject: [PATCH 19/30] I made a rebase --- src/grammar.y | 7 +++++-- src/intermediate_code.c | 3 +++ src/symbol_table.c | 4 ++-- tests/programs/fib.alpha | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/grammar.y b/src/grammar.y index a94f5dd..ccdd9da 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -608,6 +608,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 { @@ -1030,7 +1033,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){ @@ -1045,6 +1047,7 @@ expression: S_Push(FalseList, t, 1); } S_Push(t, current, 1); + /* */ // ---------------------------------------------------------------------------- printdebug("less than expression"); @@ -1064,7 +1067,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){ @@ -1079,6 +1081,7 @@ expression: S_Push(FalseList, t, 1); } S_Push(t, current, 1); + /* */ // emit_label(label_gen()); // emit_backpatch(S_Pop(TrueList), getLabel(current)); diff --git a/src/intermediate_code.c b/src/intermediate_code.c index 3a473a1..618fbba 100644 --- a/src/intermediate_code.c +++ b/src/intermediate_code.c @@ -316,7 +316,10 @@ void emit_return(TNodeOrConst *value) { void emit_reserve(TableNode *result, TNodeOrConst *size) { // this needs to change // we need to take a int + /* emit_binary_op(E_MUL, result, + */ + emit_parameter(size); emit_function_call(result, 1, tn_or_const(NODE, look_up(cur, "reserve"))); } diff --git a/src/symbol_table.c b/src/symbol_table.c index 9f81805..2f2e8ac 100644 --- a/src/symbol_table.c +++ b/src/symbol_table.c @@ -1489,7 +1489,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); @@ -1763,4 +1763,4 @@ int getStackSize() { if (i % 16 != 0) i += 8; return i; -} \ No newline at end of file +} diff --git a/tests/programs/fib.alpha b/tests/programs/fib.alpha index 287614b..1a9d185 100644 --- a/tests/programs/fib.alpha +++ b/tests/programs/fib.alpha @@ -40,7 +40,7 @@ entry (arg) := { input := inI(1); fibValue := fib(input); - + result := printI(fibValue); return 0; From 666d924608c9c9dba3d007035adefd7517d60ee6 Mon Sep 17 00:00:00 2001 From: Annie Date: Tue, 6 May 2025 20:32:57 -0400 Subject: [PATCH 20/30] YIPPEE --- src/codegen.c | 66 +++++++++++++++++++++++++++++++++++---------------- src/codegen.h | 1 + 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 3393217..1784a09 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -92,6 +92,18 @@ int generate() { 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; @@ -142,6 +154,9 @@ CGNode *addCG(TableNode *tn, int sp) { 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; @@ -519,9 +534,13 @@ 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 || !isAnActualFunction(getTN(op1))){ + 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)); + } 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; } @@ -665,21 +684,24 @@ int generateCall(Instruction *inst) { return -1; } - //if (findCG(getTN(op1)) == NULL) { - // printdebug("generateFunctionCall failed, function not in stack"); - // return -1; - //} - // if (getTN(op2) == NULL) { - // printdebug("generateFunctionCall failed, NULL tablenode2"); - // return -1; - //} - - fprintf(cg_flag, "\tcall %s\n", getName(getTN(op1))); - //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 (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); } @@ -702,8 +724,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 (isAnActualFunction(getTN(op1))) { + 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; @@ -830,14 +855,13 @@ int generateFunctionStart(Instruction *inst) { if (funList == NULL) { return -1; } - fprintf(stderr, "here\n"); TableNode *funDec; while (funList != NULL) { funDec = funList->tn; - CGNode *cg = addCG(getResult(inst), offset); + 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 d790ea9..828f16a 100644 --- a/src/codegen.h +++ b/src/codegen.h @@ -33,6 +33,7 @@ typedef struct FunDecList { struct FunDecList *next; } FunDecList; +bool isAnActualFunction(TableNode *tn); int generate(); CGNode *getNextCG(CGNode *cg); int getAddress(CGNode *cg); From b1296ddd021b96a6704788eee06841f80ad8a590 Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 21:15:09 -0400 Subject: [PATCH 21/30] read --- README.MD | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.MD b/README.MD index 525582f..f8dc6f9 100644 --- a/README.MD +++ b/README.MD @@ -1,6 +1,33 @@ # The Translators α Compiler #### Members: Annie Slenker, Meyer Simon, Partho Bhattacharya, & Scarlett Kadan +## 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) + + + ## 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 From 9633e322817048e16f6566de8348bd6a7a9addb2 Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 21:22:39 -0400 Subject: [PATCH 22/30] reading is fun --- README.MD | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/README.MD b/README.MD index f8dc6f9..953df72 100644 --- a/README.MD +++ b/README.MD @@ -27,6 +27,36 @@ Prints debug messages to the console if present. Our debug messages utilizes a w Prints a general help message. (If you read this far, you probably won't need this flag) +## Testing + + **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 ] *) + + ## Lexical Analyzer * **Undefined Behavior:** From 63bdb0a47039e837aed78341f6c92ad8379d9ca9 Mon Sep 17 00:00:00 2001 From: Meyer Simon Date: Tue, 6 May 2025 21:30:04 -0400 Subject: [PATCH 23/30] Tests for annie --- tests/programs/helloworld.alpha | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/programs/helloworld.alpha b/tests/programs/helloworld.alpha index c889222..abc43a3 100644 --- a/tests/programs/helloworld.alpha +++ b/tests/programs/helloworld.alpha @@ -4,7 +4,7 @@ function entry: string2integer entry (arg) := { [integer: result] - + result := printCharacter('H'); result := printCharacter('e'); result := printCharacter('l'); @@ -20,4 +20,4 @@ entry (arg) := { result := printCharacter('\n'); return 0; -} \ No newline at end of file +} From e23e91477aaf4a84cf0c4fe43ff5d399a85b5c10 Mon Sep 17 00:00:00 2001 From: Annie Date: Tue, 6 May 2025 21:45:09 -0400 Subject: [PATCH 24/30] fixed everything breaking i think --- src/codegen.c | 17 +++++++++-------- tests/given/test/functionValue.alpha | 26 +++++++++++++------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 1784a09..52b7b96 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -85,6 +85,7 @@ int generate() { break; case E_FUNC_DEC: generateFunctionDec(i); + break; default:; } i = i->next; @@ -388,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); @@ -439,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"); @@ -534,7 +535,7 @@ int generateAssign(Instruction *inst) { printdebug("generateAssign failed, %s is not constant but not in CGlist", getName(getTN(op1))); return -1; } - if (getAdInfoType(getTN(op1)) != TYPE_FUNCTION_DECLARATION || !isAnActualFunction(getTN(op1))){ + if (getAdInfoType(getTN(op1)) != TYPE_FUNCTION_DECLARATION || table_lookup(getAncestor(cur), getName(getTN(op1))) == undefined){ 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)); } else { @@ -724,7 +725,7 @@ int generateReturn(Instruction *inst) { printdebug("generateReturn failed, trying to return %s not in CGList", getName(getTN(op1))); return -1; } - if (isAnActualFunction(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))); @@ -851,7 +852,7 @@ int generateFunctionStart(Instruction *inst) { } } - if (strcmp(getName(funDecTN), "entry") == 0) { +/* if (strcmp(getName(funDecTN), "entry") == 0) { if (funList == NULL) { return -1; } @@ -862,6 +863,6 @@ int generateFunctionStart(Instruction *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/tests/given/test/functionValue.alpha b/tests/given/test/functionValue.alpha index aa31fde..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,8 +22,8 @@ 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 @@ -37,8 +37,8 @@ function entry: string2int a(x) := { [string : s] - s := x; - + x:= printInteger(x); + return 0; } @@ -51,7 +51,7 @@ b(x) := { c(x) := { [string: s] s := "Hi!"; - return a(s); + return 3; } @@ -59,11 +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 := f("ahhh"); - result := c(f); + result := f(temp); + (*result := c(f);*) if (d(1,2,'c')) then { result := 0; @@ -72,6 +72,6 @@ entry(arg) := { [ Boolean : b] result := entry("hello"); } - result := c(f); + (*result := c(f);*) return result; } From 0db52f8e8f38135d01ffa725726f791ec8fd85ff Mon Sep 17 00:00:00 2001 From: Meyer Simon Date: Tue, 6 May 2025 22:00:55 -0400 Subject: [PATCH 25/30] Test for annie --- tests/programs/sp3_if_else_sse.alpha | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tests/programs/sp3_if_else_sse.alpha diff --git a/tests/programs/sp3_if_else_sse.alpha b/tests/programs/sp3_if_else_sse.alpha new file mode 100644 index 0000000..49d345f --- /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 := false; + y := true; + if ( x | y ) then { + + (* + if ( x Date: Tue, 6 May 2025 22:16:58 -0400 Subject: [PATCH 26/30] cool things --- README.MD | 75 ++++++++++++++------------ tests/programs/array.alpha | 20 +++++++ tests/programs/io.alpha | 27 ---------- tests/programs/ll.alpha | 1 - tests/sprint4/test/sp4_tc_arrays.alpha | 27 ---------- 5 files changed, 61 insertions(+), 89 deletions(-) create mode 100644 tests/programs/array.alpha delete mode 100644 tests/programs/io.alpha delete mode 100644 tests/programs/ll.alpha delete mode 100644 tests/sprint4/test/sp4_tc_arrays.alpha diff --git a/README.MD b/README.MD index 953df72..c4ace9a 100644 --- a/README.MD +++ b/README.MD @@ -1,7 +1,7 @@ # The Translators α Compiler #### Members: Annie Slenker, Meyer Simon, Partho Bhattacharya, & Scarlett Kadan -## Alpha Compiler Flags & Expected Results +## 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. @@ -27,48 +27,55 @@ Prints debug messages to the console if present. Our debug messages utilizes a w Prints a general help message. (If you read this far, you probably won't need this flag) -## Testing +## 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. - **Arguments:** - -exp Generate expected output files - -diff Compare output files with expected output files - -help Show this help message +### ./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 +> **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 +> **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 ] *) +> **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.* -## 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 +> **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/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/io.alpha b/tests/programs/io.alpha deleted file mode 100644 index ddfb00e..0000000 --- a/tests/programs/io.alpha +++ /dev/null @@ -1,27 +0,0 @@ -#include "std.alpha" - -function entry: string2integer - -entry (arg) := { - [integer: x; string: s; character: c; integer: result] - - result := printCharacter('\t'); - result := printCharacter('t'); - result := printCharacter('a'); - result := printCharacter('b'); - result := printCharacter('\n'); - result := printCharacter('\\'); - result := printCharacter('"'); - result := printCharacter('\''); - - (*s := inS(1); - result := printS(s); - - x := inI(1); - result := printI(x); - - c := inC(1); - result := printC(c);*) - - 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/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 From 5a01cb8419e38623e3cae98490385571894bf9f4 Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 22:35:26 -0400 Subject: [PATCH 27/30] tests update --- tests/given/README.MD | 1 + tests/sprint1/expected/sp1_include.asc.exp | 3 + tests/sprint1/expected/sp1_include.tok.exp | 6 ++ .../sprint2/expected/sp2_carls_mistake.st.exp | 3 + tests/sprint2/expected/sp2_llnode.st.exp | 3 + tests/sprint2/expected/sp2_llnode_bad.st.exp | 4 ++ .../sprint2/expected/sp2_sp2_arrayargs.st.exp | 8 +++ .../sp2_valid_assignable_and_mem.st.exp | 10 ++- .../test/sp2_valid_assignable_and_mem.alpha | 2 +- .../expected/sp3_and_or_type_check.asc.exp | 12 ++-- .../sprint3/expected/sp3_arr_reserve.asc.exp | 10 +++ .../sp3_boolean_binary_op_typecheck.asc.exp | 4 +- .../expected/sp3_carls_second_mistake.asc.exp | 3 - tests/sprint3/expected/sp3_if_else.asc.exp | 21 +++--- .../expected/sp3_if_else_nested_exp.asc.exp | 25 ++++++++ .../sprint3/expected/sp3_if_else_sse.asc.exp | 31 +++++++++ .../sprint3/expected/sp3_if_else_sse2.asc.exp | 34 ++++++++++ .../expected/sp3_while_nested_bools.asc.exp | 29 +++++++++ tests/sprint3/expected/sp3_while_sse.asc.exp | 27 ++++++++ tests/sprint3/test/sp3_arr_reserve.alpha | 2 +- .../sprint3/test/sp3_if_else_nested_exp.alpha | 1 + tests/sprint3/test/sp3_if_else_sse.alpha | 1 + tests/sprint3/test/sp3_if_else_sse2.alpha | 1 + .../sprint3/test/sp3_while_nested_bools.alpha | 1 + tests/sprint3/test/sp3_while_sse.alpha | 1 + tests/sprint4/expected/sp4_cg_add.asc.exp | 4 +- tests/sprint4/expected/sp4_cg_add.ir.exp | 22 +++---- tests/sprint4/expected/sp4_cg_add.s.exp | 6 +- tests/sprint4/expected/sp4_cg_calls.asc.exp | 40 ++++++------ tests/sprint4/expected/sp4_cg_calls.ir.exp | 64 ++++++++++--------- tests/sprint4/expected/sp4_cg_calls.s.exp | 59 +++++++++-------- tests/sprint4/expected/sp4_cg_div.ir.exp | 22 +++---- tests/sprint4/expected/sp4_cg_div.s.exp | 6 +- tests/sprint4/expected/sp4_cg_equal_to.ir.exp | 21 +++--- tests/sprint4/expected/sp4_cg_equal_to.s.exp | 21 +++--- .../sprint4/expected/sp4_cg_less_than.ir.exp | 21 +++--- tests/sprint4/expected/sp4_cg_less_than.s.exp | 20 +++--- tests/sprint4/expected/sp4_cg_mod.ir.exp | 22 +++---- tests/sprint4/expected/sp4_cg_mod.s.exp | 6 +- tests/sprint4/expected/sp4_cg_mult.ir.exp | 22 +++---- tests/sprint4/expected/sp4_cg_mult.s.exp | 6 +- tests/sprint4/expected/sp4_cg_neg.ir.exp | 17 ++--- tests/sprint4/expected/sp4_cg_neg.s.exp | 5 +- tests/sprint4/expected/sp4_cg_not.ir.exp | 7 +- tests/sprint4/expected/sp4_cg_not.s.exp | 15 ++--- tests/sprint4/expected/sp4_cg_or.ir.exp | 28 ++++---- tests/sprint4/expected/sp4_cg_or.s.exp | 28 ++++---- tests/sprint4/expected/sp4_cg_sub.ir.exp | 22 +++---- tests/sprint4/expected/sp4_cg_sub.s.exp | 6 +- 49 files changed, 442 insertions(+), 291 deletions(-) create mode 100644 tests/given/README.MD create mode 100644 tests/sprint1/expected/sp1_include.asc.exp create mode 100644 tests/sprint1/expected/sp1_include.tok.exp create mode 100644 tests/sprint3/expected/sp3_arr_reserve.asc.exp create mode 100644 tests/sprint3/expected/sp3_if_else_nested_exp.asc.exp create mode 100644 tests/sprint3/expected/sp3_if_else_sse.asc.exp create mode 100644 tests/sprint3/expected/sp3_if_else_sse2.asc.exp create mode 100644 tests/sprint3/expected/sp3_while_nested_bools.asc.exp create mode 100644 tests/sprint3/expected/sp3_while_sse.asc.exp 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/sprint1/expected/sp1_include.asc.exp b/tests/sprint1/expected/sp1_include.asc.exp new file mode 100644 index 0000000..d987cea --- /dev/null +++ b/tests/sprint1/expected/sp1_include.asc.exp @@ -0,0 +1,3 @@ +001: #include "alpha.h" +002: #include "alpha.h" +003: #include "alpha.h" \ No newline at end of file diff --git a/tests/sprint1/expected/sp1_include.tok.exp b/tests/sprint1/expected/sp1_include.tok.exp new file mode 100644 index 0000000..086c1ce --- /dev/null +++ b/tests/sprint1/expected/sp1_include.tok.exp @@ -0,0 +1,6 @@ +1 1 901 "#include" +1 10 304 ""alpha.h"" +2 1 901 "#include" +2 10 304 ""alpha.h"" +3 1 901 "#include" +3 10 304 ""alpha.h"" diff --git a/tests/sprint2/expected/sp2_carls_mistake.st.exp b/tests/sprint2/expected/sp2_carls_mistake.st.exp index 7fe89f6..edcf5c5 100644 --- a/tests/sprint2/expected/sp2_carls_mistake.st.exp +++ b/tests/sprint2/expected/sp2_carls_mistake.st.exp @@ -23,6 +23,9 @@ arg : 025000 : 001001 : string result : 025000 : 001001 : integer : Primitive Instance w : 025000 : 001001 : rec : Record Instance ------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: r : 021000 : 001001 : integer : Primitive Instance s : 021000 : 001001 : integer : Primitive Instance ------------------------------:--------:--------:-----------------------------------:-----------------------------------: diff --git a/tests/sprint2/expected/sp2_llnode.st.exp b/tests/sprint2/expected/sp2_llnode.st.exp index 8b78bd3..abbd641 100644 --- a/tests/sprint2/expected/sp2_llnode.st.exp +++ b/tests/sprint2/expected/sp2_llnode.st.exp @@ -26,6 +26,9 @@ result : 068000 : 001001 : integer w : 068000 : 001001 : rec : Record Instance li : 068000 : 001001 : llnode : Record Instance ------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: r : 053000 : 001001 : integer : Primitive Instance s : 053000 : 001001 : integer : Primitive Instance ------------------------------:--------:--------:-----------------------------------:-----------------------------------: diff --git a/tests/sprint2/expected/sp2_llnode_bad.st.exp b/tests/sprint2/expected/sp2_llnode_bad.st.exp index cebad8b..d6e60a4 100644 --- a/tests/sprint2/expected/sp2_llnode_bad.st.exp +++ b/tests/sprint2/expected/sp2_llnode_bad.st.exp @@ -26,6 +26,10 @@ result : 069000 : 001001 : integer w : 069000 : 001001 : rec : Record Instance li : 069000 : 001001 : llnode : Record Instance ------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: +------------------------------:--------:--------:-----------------------------------:-----------------------------------: r : 054000 : 001001 : integer : Primitive Instance s : 054000 : 001001 : integer : Primitive Instance ------------------------------:--------:--------:-----------------------------------:-----------------------------------: diff --git a/tests/sprint2/expected/sp2_sp2_arrayargs.st.exp b/tests/sprint2/expected/sp2_sp2_arrayargs.st.exp index b76e609..028f8a4 100644 --- a/tests/sprint2/expected/sp2_sp2_arrayargs.st.exp +++ b/tests/sprint2/expected/sp2_sp2_arrayargs.st.exp @@ -14,3 +14,11 @@ a_of_s : 001001 : : 1 -> 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_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 c234273..d4499a0 100644 --- a/tests/sprint4/expected/sp4_cg_add.asc.exp +++ b/tests/sprint4/expected/sp4_cg_add.asc.exp @@ -1,4 +1,4 @@ -001: +001: 002: type string: 1 -> character 003: type BooleanXBoolean: [Boolean: x; Boolean: y] 004: type characterXcharacter: [character: x; character: y] @@ -34,7 +34,7 @@ 034: external function inC: integer2character 035: 036: function entry: string2integer -037: +037: 038: entry (arg) := { 039: [integer:x; integer:y; integer: result] 040: diff --git a/tests/sprint4/expected/sp4_cg_add.ir.exp b/tests/sprint4/expected/sp4_cg_add.ir.exp index 73beb15..80451f3 100644 --- a/tests/sprint4/expected/sp4_cg_add.ir.exp +++ b/tests/sprint4/expected/sp4_cg_add.ir.exp @@ -1,16 +1,12 @@ 1: func_dec : entry 2: func : entry 3: $t0 = 1 - 4: Label : 1 - 5: y = $t0 - 6: $t1 = 3 - 7: Label : 2 - 8: x = $t1 - 9: $t2 = x + y - 10: Label : 3 - 11: y = $t2 - 12: param y - 13: call : printInteger 1 - 14: Label : 4 - 15: result = $t3 - 16: return : y + 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 f58dd79..c47a3d4 100644 --- a/tests/sprint4/expected/sp4_cg_add.s.exp +++ b/tests/sprint4/expected/sp4_cg_add.s.exp @@ -2,27 +2,23 @@ entry: pushq %rbp movq %rsp, %rbp - subq $128, %rsp + subq $400, %rsp movl %edi, -8(%rbp) #FunctionStart1param end movl $1, -12(%rbp) #constant assign -.L1: movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end movl $3, -20(%rbp) #constant assign -.L2: movl -20(%rbp), %eax #assign start movl %eax, -24(%rbp) #assign end movl -24(%rbp), %eax #addition start addl -16(%rbp), %eax movl %eax, -28(%rbp) #addition end -.L3: 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 -.L4: movl -32(%rbp), %eax #assign start movl %eax, -36(%rbp) #assign end movl -16(%rbp), %eax #return y diff --git a/tests/sprint4/expected/sp4_cg_calls.asc.exp b/tests/sprint4/expected/sp4_cg_calls.asc.exp index edc0a7a..831976b 100644 --- a/tests/sprint4/expected/sp4_cg_calls.asc.exp +++ b/tests/sprint4/expected/sp4_cg_calls.asc.exp @@ -35,26 +35,26 @@ 035: 036: function entry: string2integer 037: -038: -039: type rec: [integer: x; integer: y; integer: z; integer: a; integer: b; integer: c; integer: d] -040: type T2: rec -> integer -041: type T: integer -> integer -042: function bar: T2 -043: function ahh: T -044: -045: ahh (a) := { -046: a := printInteger(a); -047: return -1; -048: } -049: -050: bar (a, b, c,d,e,f,g) := { -051: a := printInteger(g); -052: return b; -053: } -054: -055: entry (arg) := { -056: [integer:x; integer:y; integer: result] -057: +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 index 2995985..cbaa89e 100644 --- a/tests/sprint4/expected/sp4_cg_calls.ir.exp +++ b/tests/sprint4/expected/sp4_cg_calls.ir.exp @@ -4,34 +4,36 @@ 4: func : ahh 5: param a 6: call : printInteger 1 - 7: Label : 1 - 8: a = $t0 - 9: $t1 = 1 - 10: $t2 = -$t1 - 11: return : $t2 - 12: func : bar - 13: param g - 14: call : printInteger 1 - 15: Label : 2 - 16: a = $t3 - 17: return : b - 18: func : entry - 19: $t4 = 1 - 20: $t5 = 2 - 21: $t6 = 3 - 22: $t7 = 4 - 23: $t8 = 5 - 24: $t9 = 6 - 25: $t10 = 7 - 26: param $t10 - 27: param $t9 - 28: param $t8 - 29: param $t7 - 30: param $t6 - 31: param $t5 - 32: param $t4 - 33: call : bar 7 - 34: Label : 3 - 35: result = $t11 - 36: $t12 = 1 - 37: return : $t12 + 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 index 55b65cb..0d28c99 100644 --- a/tests/sprint4/expected/sp4_cg_calls.s.exp +++ b/tests/sprint4/expected/sp4_cg_calls.s.exp @@ -2,12 +2,11 @@ ahh: pushq %rbp movq %rsp, %rbp - subq $128, %rsp + 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 -.L1: movl -8(%rbp), %eax #assign start movl %eax, -4(%rbp) #assign end movl $1, -12(%rbp) #constant assign @@ -20,7 +19,7 @@ ahh: bar: pushq %rbp movq %rsp, %rbp - subq $128, %rsp + subq $576, %rsp movl 20(%rbp), %eax #FunctionStart1Param start movl %eax, -4(%rbp) #FunctionStart1param end movl %r9d, -12(%rbp) #FunctionStart1param end @@ -32,7 +31,6 @@ bar: movl -32(%rbp), %edi #adding param start call printInteger movl %eax, -36(%rbp) #store return from call -.L2: movl -36(%rbp), %eax #assign start movl %eax, -4(%rbp) #assign end movl -12(%rbp), %eax #return b @@ -41,29 +39,36 @@ bar: entry: pushq %rbp movq %rsp, %rbp - subq $128, %rsp - movl %edi, -8(%rbp) #FunctionStart1param end - movl $1, -12(%rbp) #constant assign - movl $2, -16(%rbp) #constant assign - movl $3, -20(%rbp) #constant assign - movl $4, -24(%rbp) #constant assign - movl $5, -28(%rbp) #constant assign - movl $6, -32(%rbp) #constant assign - movl $7, -36(%rbp) #constant assign - movl -36(%rbp), %edi #adding param start - movl -32(%rbp), %esi #adding param start - movl -28(%rbp), %edx #adding param start - movl -24(%rbp), %ecx #adding param start - movl -20(%rbp), %r8d #adding param start - movl -16(%rbp), %r9d #adding param start - movl -12(%rbp), %eax #adding param start - movl %eax, 88(%rbp) #adding param end + 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, -44(%rbp) #store return from call -.L3: - movl -44(%rbp), %eax #assign start - movl %eax, -48(%rbp) #assign end - movl $1, -52(%rbp) #constant assign - movl -52(%rbp), %eax #return $t12 + 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.ir.exp b/tests/sprint4/expected/sp4_cg_div.ir.exp index f316a19..56f58fd 100644 --- a/tests/sprint4/expected/sp4_cg_div.ir.exp +++ b/tests/sprint4/expected/sp4_cg_div.ir.exp @@ -1,16 +1,12 @@ 1: func_dec : entry 2: func : entry 3: $t0 = 24 - 4: Label : 1 - 5: x = $t0 - 6: $t1 = 3 - 7: Label : 2 - 8: y = $t1 - 9: $t2 = x / y - 10: Label : 3 - 11: y = $t2 - 12: param y - 13: call : printInteger 1 - 14: Label : 4 - 15: result = $t3 - 16: return : y + 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 cc51cef..53861da 100644 --- a/tests/sprint4/expected/sp4_cg_div.s.exp +++ b/tests/sprint4/expected/sp4_cg_div.s.exp @@ -2,27 +2,23 @@ entry: pushq %rbp movq %rsp, %rbp - subq $128, %rsp + subq $400, %rsp movl %edi, -8(%rbp) #FunctionStart1param end movl $24, -12(%rbp) #constant assign -.L1: movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end movl $3, -20(%rbp) #constant assign -.L2: movl -20(%rbp), %eax #assign start movl %eax, -24(%rbp) #assign end movl -16(%rbp), %eax #division start cltd idivl -24(%rbp) movl %eax, -28(%rbp) #division end -.L3: 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 -.L4: movl -32(%rbp), %eax #assign start movl %eax, -36(%rbp) #assign end movl -24(%rbp), %eax #return y diff --git a/tests/sprint4/expected/sp4_cg_equal_to.ir.exp b/tests/sprint4/expected/sp4_cg_equal_to.ir.exp index d0b9e1c..c8ec780 100644 --- a/tests/sprint4/expected/sp4_cg_equal_to.ir.exp +++ b/tests/sprint4/expected/sp4_cg_equal_to.ir.exp @@ -1,17 +1,16 @@ 1: func_dec : entry 2: func : entry 3: $t0 = 1 - 4: Label : 1 - 5: x = $t0 - 6: $t1 = 2 - 7: Label : 2 - 8: y = $t1 - 9: $t2 = x == y - 10: Label : 3 + 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: Label : 4 - 15: result = $t3 - 16: $t4 = 1 - 17: return : $t4 + 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 374f095..038d473 100644 --- a/tests/sprint4/expected/sp4_cg_equal_to.s.exp +++ b/tests/sprint4/expected/sp4_cg_equal_to.s.exp @@ -2,30 +2,31 @@ entry: pushq %rbp movq %rsp, %rbp - subq $128, %rsp + subq $416, %rsp movl %edi, -8(%rbp) #FunctionStart1param end movl $1, -12(%rbp) #constant assign -.L1: movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end movl $2, -20(%rbp) #constant assign -.L2: 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 $0, -25(%rbp) movb %al, -25(%rbp) #equal to end -.L3: + 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, -30(%rbp) #store return from call -.L4: - movl -30(%rbp), %eax #assign start - movl %eax, -34(%rbp) #assign end - movl $1, -38(%rbp) #constant assign - movl -38(%rbp), %eax #return $t4 + 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.ir.exp b/tests/sprint4/expected/sp4_cg_less_than.ir.exp index 169347b..ff83dbc 100644 --- a/tests/sprint4/expected/sp4_cg_less_than.ir.exp +++ b/tests/sprint4/expected/sp4_cg_less_than.ir.exp @@ -1,17 +1,16 @@ 1: func_dec : entry 2: func : entry 3: $t0 = 1 - 4: Label : 1 - 5: x = $t0 - 6: $t1 = 2 - 7: Label : 2 - 8: y = $t1 - 9: $t2 = x < y - 10: Label : 3 + 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: Label : 4 - 15: result = $t3 - 16: $t4 = 1 - 17: return : $t4 + 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 57c2a33..a9235cd 100644 --- a/tests/sprint4/expected/sp4_cg_less_than.s.exp +++ b/tests/sprint4/expected/sp4_cg_less_than.s.exp @@ -2,30 +2,30 @@ entry: pushq %rbp movq %rsp, %rbp - subq $128, %rsp + subq $416, %rsp movl %edi, -8(%rbp) #FunctionStart1param end movl $1, -12(%rbp) #constant assign -.L1: movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end movl $2, -20(%rbp) #constant assign -.L2: 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, -25(%rbp) #less than end -.L3: + 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, -30(%rbp) #store return from call -.L4: - movl -30(%rbp), %eax #assign start - movl %eax, -34(%rbp) #assign end - movl $1, -38(%rbp) #constant assign - movl -38(%rbp), %eax #return $t4 + 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.ir.exp b/tests/sprint4/expected/sp4_cg_mod.ir.exp index 4c2421e..1148d7e 100644 --- a/tests/sprint4/expected/sp4_cg_mod.ir.exp +++ b/tests/sprint4/expected/sp4_cg_mod.ir.exp @@ -1,16 +1,12 @@ 1: func_dec : entry 2: func : entry 3: $t0 = 4 - 4: Label : 1 - 5: x = $t0 - 6: $t1 = 20 - 7: Label : 2 - 8: y = $t1 - 9: $t2 = y % x - 10: Label : 3 - 11: y = $t2 - 12: param y - 13: call : printInteger 1 - 14: Label : 4 - 15: result = $t3 - 16: return : y + 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 85cd9db..c76ec55 100644 --- a/tests/sprint4/expected/sp4_cg_mod.s.exp +++ b/tests/sprint4/expected/sp4_cg_mod.s.exp @@ -2,27 +2,23 @@ entry: pushq %rbp movq %rsp, %rbp - subq $128, %rsp + subq $400, %rsp movl %edi, -8(%rbp) #FunctionStart1param end movl $4, -12(%rbp) #constant assign -.L1: movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end movl $20, -20(%rbp) #constant assign -.L2: movl -20(%rbp), %eax #assign start movl %eax, -24(%rbp) #assign end movl -24(%rbp), %eax #mod start cltd idivl -16(%rbp) movl %edx, -28(%rbp) #mod end -.L3: 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 -.L4: movl -32(%rbp), %eax #assign start movl %eax, -36(%rbp) #assign end movl -24(%rbp), %eax #return y diff --git a/tests/sprint4/expected/sp4_cg_mult.ir.exp b/tests/sprint4/expected/sp4_cg_mult.ir.exp index 70de136..12ec01d 100644 --- a/tests/sprint4/expected/sp4_cg_mult.ir.exp +++ b/tests/sprint4/expected/sp4_cg_mult.ir.exp @@ -1,16 +1,12 @@ 1: func_dec : entry 2: func : entry 3: $t0 = 3 - 4: Label : 1 - 5: x = $t0 - 6: $t1 = 20 - 7: Label : 2 - 8: y = $t1 - 9: $t2 = x * y - 10: Label : 3 - 11: y = $t2 - 12: param y - 13: call : printInteger 1 - 14: Label : 4 - 15: result = $t3 - 16: return : y + 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 567acb3..019a840 100644 --- a/tests/sprint4/expected/sp4_cg_mult.s.exp +++ b/tests/sprint4/expected/sp4_cg_mult.s.exp @@ -2,26 +2,22 @@ entry: pushq %rbp movq %rsp, %rbp - subq $128, %rsp + subq $400, %rsp movl %edi, -8(%rbp) #FunctionStart1param end movl $3, -12(%rbp) #constant assign -.L1: movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end movl $20, -20(%rbp) #constant assign -.L2: movl -20(%rbp), %eax #assign start movl %eax, -24(%rbp) #assign end movl -16(%rbp), %eax #multiplication start imull -24(%rbp), %eax movl %eax, -28(%rbp) #multiplication end -.L3: 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 -.L4: movl -32(%rbp), %eax #assign start movl %eax, -36(%rbp) #assign end movl -24(%rbp), %eax #return y diff --git a/tests/sprint4/expected/sp4_cg_neg.ir.exp b/tests/sprint4/expected/sp4_cg_neg.ir.exp index 9bc3442..88e0fc4 100644 --- a/tests/sprint4/expected/sp4_cg_neg.ir.exp +++ b/tests/sprint4/expected/sp4_cg_neg.ir.exp @@ -1,13 +1,10 @@ 1: func_dec : entry 2: func : entry 3: $t0 = 3 - 4: Label : 1 - 5: x = $t0 - 6: $t1 = -x - 7: Label : 2 - 8: y = $t1 - 9: param y - 10: call : printInteger 1 - 11: Label : 3 - 12: result = $t2 - 13: return : y + 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 ddf2a63..6e92063 100644 --- a/tests/sprint4/expected/sp4_cg_neg.s.exp +++ b/tests/sprint4/expected/sp4_cg_neg.s.exp @@ -2,22 +2,19 @@ entry: pushq %rbp movq %rsp, %rbp - subq $128, %rsp + subq $400, %rsp movl %edi, -8(%rbp) #FunctionStart1param end movl $3, -12(%rbp) #constant assign -.L1: 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 -.L2: 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 -.L3: movl -28(%rbp), %eax #assign start movl %eax, -32(%rbp) #assign end movl -24(%rbp), %eax #return y diff --git a/tests/sprint4/expected/sp4_cg_not.ir.exp b/tests/sprint4/expected/sp4_cg_not.ir.exp index 5a9a503..eb3abe9 100644 --- a/tests/sprint4/expected/sp4_cg_not.ir.exp +++ b/tests/sprint4/expected/sp4_cg_not.ir.exp @@ -7,7 +7,6 @@ 7: d = $t1 8: param d 9: call : printBoolean 1 - 10: Label : 3 - 11: result = $t2 - 12: $t3 = 1 - 13: return : $t3 + 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 63b18a5..8739ed0 100644 --- a/tests/sprint4/expected/sp4_cg_not.s.exp +++ b/tests/sprint4/expected/sp4_cg_not.s.exp @@ -2,20 +2,19 @@ entry: pushq %rbp movq %rsp, %rbp - subq $128, %rsp + subq $400, %rsp movl %edi, -8(%rbp) #FunctionStart1param end - movl $-1, -9(%rbp) #constant assign + 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, -15(%rbp) #store return from call -.L3: - movl -15(%rbp), %eax #assign start - movl %eax, -19(%rbp) #assign end - movl $1, -23(%rbp) #constant assign - movl -23(%rbp), %eax #return $t3 + 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.ir.exp b/tests/sprint4/expected/sp4_cg_or.ir.exp index 0319c40..4470879 100644 --- a/tests/sprint4/expected/sp4_cg_or.ir.exp +++ b/tests/sprint4/expected/sp4_cg_or.ir.exp @@ -7,18 +7,16 @@ 7: Label : 2 8: d = $t1 9: $t2 = true - 10: Label : 3 - 11: if c True GOTO 5 - 12: GOTO : 4 - 13: Label : 4 - 14: if d True GOTO 5 - 15: $t2 = false - 16: GOTO : 5 - 17: Label : 5 - 18: d = $t2 - 19: param d - 20: call : printBoolean 1 - 21: Label : 6 - 22: result = $t3 - 23: $t4 = 1 - 24: return : $t4 + 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 0493673..1ca0a6a 100644 --- a/tests/sprint4/expected/sp4_cg_or.s.exp +++ b/tests/sprint4/expected/sp4_cg_or.s.exp @@ -2,30 +2,34 @@ entry: pushq %rbp movq %rsp, %rbp - subq $128, %rsp + subq $416, %rsp movl %edi, -8(%rbp) #FunctionStart1param end - movl $-1, -9(%rbp) #constant assign + movl $1, -9(%rbp) #constant assign .L1: movl -9(%rbp), %eax #assign start movl %eax, -10(%rbp) #assign end - movl $-1, -11(%rbp) #constant assign + 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 + 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 $-1, -13(%rbp) #constant assign -.L5: movl -13(%rbp), %eax #assign start movl %eax, -12(%rbp) #assign end movl -12(%rbp), %edi #adding param start call printBoolean - movl %eax, -17(%rbp) #store return from call -.L6: - movl -17(%rbp), %eax #assign start - movl %eax, -21(%rbp) #assign end - movl $1, -25(%rbp) #constant assign - movl -25(%rbp), %eax #return $t4 + 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.ir.exp b/tests/sprint4/expected/sp4_cg_sub.ir.exp index 23e60d4..468b1eb 100644 --- a/tests/sprint4/expected/sp4_cg_sub.ir.exp +++ b/tests/sprint4/expected/sp4_cg_sub.ir.exp @@ -1,16 +1,12 @@ 1: func_dec : entry 2: func : entry 3: $t0 = 1 - 4: Label : 1 - 5: y = $t0 - 6: $t1 = 3 - 7: Label : 2 - 8: x = $t1 - 9: $t2 = x - y - 10: Label : 3 - 11: y = $t2 - 12: param y - 13: call : printInteger 1 - 14: Label : 4 - 15: result = $t3 - 16: return : y + 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 bc47b9f..8f2c60e 100644 --- a/tests/sprint4/expected/sp4_cg_sub.s.exp +++ b/tests/sprint4/expected/sp4_cg_sub.s.exp @@ -2,26 +2,22 @@ entry: pushq %rbp movq %rsp, %rbp - subq $128, %rsp + subq $400, %rsp movl %edi, -8(%rbp) #FunctionStart1param end movl $1, -12(%rbp) #constant assign -.L1: movl -12(%rbp), %eax #assign start movl %eax, -16(%rbp) #assign end movl $3, -20(%rbp) #constant assign -.L2: movl -20(%rbp), %eax #assign start movl %eax, -24(%rbp) #assign end movl -24(%rbp), %eax #subtraction start subl -16(%rbp), %eax movl %eax, -28(%rbp) #subtraction end -.L3: 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 -.L4: movl -32(%rbp), %eax #assign start movl %eax, -36(%rbp) #assign end movl -16(%rbp), %eax #return y From fe2c8da7a4b150d57cdf3fdc24c489dd3dc0d0ee Mon Sep 17 00:00:00 2001 From: Scarlett Date: Tue, 6 May 2025 22:57:42 -0400 Subject: [PATCH 28/30] reading is fun --- README.MD | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.MD b/README.MD index c4ace9a..74270bf 100644 --- a/README.MD +++ b/README.MD @@ -57,7 +57,9 @@ All tests under sprint 1, 2, 3, & 4 will work with the testing suite, along with ### ./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.* +**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
From 29c1d1fd946b445a8d6753f23bb743f668c52b42 Mon Sep 17 00:00:00 2001 From: Annie Date: Tue, 6 May 2025 22:57:14 -0400 Subject: [PATCH 29/30] updated number of bytes used --- src/codegen.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 52b7b96..44d39df 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -536,8 +536,24 @@ int generateAssign(Instruction *inst) { return -1; } if (getAdInfoType(getTN(op1)) != TYPE_FUNCTION_DECLARATION || table_lookup(getAncestor(cur), getName(getTN(op1))) == undefined){ - 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)); + 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)); @@ -746,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; From 05a1a671b6bb6adb640bd7fb1f40d5cede491fc3 Mon Sep 17 00:00:00 2001 From: Annie Date: Tue, 6 May 2025 22:59:12 -0400 Subject: [PATCH 30/30] test --- tests/programs/sp3_if_else_sse.alpha | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/programs/sp3_if_else_sse.alpha b/tests/programs/sp3_if_else_sse.alpha index 49d345f..c78ce35 100644 --- a/tests/programs/sp3_if_else_sse.alpha +++ b/tests/programs/sp3_if_else_sse.alpha @@ -15,7 +15,7 @@ bar (r,s) := { *) entry (arg) := { [ Boolean:x ; Boolean:y ; Boolean:z ; Boolean:t; integer: c] - x := false; + x := true; y := true; if ( x | y ) then {