From e6b0e22330b24e9bbe031c5c59e37d9c2d3cc0d0 Mon Sep 17 00:00:00 2001 From: "aljazbrodar." Date: Fri, 16 Jan 2026 11:44:05 +0100 Subject: [PATCH] type assertion in type switch nad AST pri 1. prehodu --- ass3/zbirnik/parsing/delme.txt | 37 +++++++++ ass3/zbirnik/parsing/input.asm | 58 ++++++-------- ass3/zbirnik/parsing/input_invalid.asm | 11 +-- ass3/zbirnik/parsing/pregledovalnik.go | 101 ++++++++++++++++++++----- ass3/zbirnik/parsing/test.obj | 2 +- 5 files changed, 144 insertions(+), 65 deletions(-) create mode 100644 ass3/zbirnik/parsing/delme.txt diff --git a/ass3/zbirnik/parsing/delme.txt b/ass3/zbirnik/parsing/delme.txt new file mode 100644 index 0000000..b0aa803 --- /dev/null +++ b/ass3/zbirnik/parsing/delme.txt @@ -0,0 +1,37 @@ +{arithr START 7 0 0} +{ 4 3 3 10 false false false false false true} +{ 168 2 2 A 10} +{ 108 3 3 11 false false false false false true} +{ 116 3 3 5 false false false false false true} +{ 0 3 3 ZERO false false false false false false} +{ 144 2 2 S A} +{ 144 2 2 T A} +{ 12 3 3 sum false false false false false false} +{ 0 3 3 ZERO false false false false false false} +{ 144 2 2 S A} +{ 148 2 2 T A} +{ 12 3 3 diff false false false false false false} +{ 0 3 3 ZERO false false false false false false} +{ 144 2 2 S A} +{ 152 2 2 T A} +{ 12 3 3 prod false false false false false false} +{ 0 3 3 ZERO false false false false false false} +{ 144 2 2 S A} +{ 156 2 2 T A} +{ 12 3 3 quot false false false false false false} +{ 0 3 3 ZERO false false false false false false} +{ 144 2 2 S A} +{LOOP 148 2 2 T A} +{ 160 2 2 A T} +{ 52 3 3 LOOP false false false false false false} +{ 48 3 3 LOOP false false false false false false} +{ 12 3 3 mod false false false false false false} +{HALT 60 3 3 HALT false false false false false false} +{ END 7 0 arithr} +{ZERO WORD 9 3 0 0} +{one BYTE 9 1 123 123} +{sum RESW 8 0 1 3} +{diff RESW 8 0 1 3} +{prod RESW 8 0 1 3} +{quot RESW 8 0 1 3} +{mod RESW 8 0 1 { WORD 9 3 400 1200} WORD 9 3 400 1200} diff --git a/ass3/zbirnik/parsing/input.asm b/ass3/zbirnik/parsing/input.asm index 34b4541..8e16cae 100644 --- a/ass3/zbirnik/parsing/input.asm +++ b/ass3/zbirnik/parsing/input.asm @@ -1,44 +1,32 @@ -arithr START 0 .komentar1 - LDX #10 - SHIFTR A, 10, X - LDS #11 .komentar2 - LDT #5 - .komentar3 - LDA ZERO - ADDR S, A - ADDR T, A - STA sum - - .komentar4 - LDA ZERO - ADDR S, A - SUBR T, A +arith START 0 + LDA x + ADD y + STA sum + LDA x + SUB y STA diff - - LDA ZERO - ADDR S, A - MULR T, A + + LDA x + MUL y STA prod - - LDA ZERO - ADDR S, A - DIVR T, A + + LDA x + DIV y STA quot - LDA ZERO - ADDR S, A -LOOP SUBR T, A .komentar5 - COMPR A, T - JGT LOOP - JEQ LOOP - STA mod -HALT J HALT - END arithr + LDA y + MUL quot + STA mod + LDA x + SUB mod + STA mod +HALT J HALT + END arith -ZERO WORD 0 +x WORD 11 +y WORD 5 sum RESW 1 diff RESW 1 prod RESW 1 -quot RESW 1 .komentar6 +quot RESW 1 mod RESW 1 -.komentar7 diff --git a/ass3/zbirnik/parsing/input_invalid.asm b/ass3/zbirnik/parsing/input_invalid.asm index e2d3c09..13592ea 100644 --- a/ass3/zbirnik/parsing/input_invalid.asm +++ b/ass3/zbirnik/parsing/input_invalid.asm @@ -1,30 +1,24 @@ arithr START 0 .komentar1 LDX #10 - SHIFTR A, 10, X + SHIFTR A, 10 LDS #11 .komentar2 LDT #5 - .komentar3 LDA ZERO ADDR S, A ADDR T, A STA sum - - .komentar4 LDA ZERO ADDR S, A SUBR T, A STA diff - LDA ZERO ADDR S, A MULR T, A STA prod - LDA ZERO ADDR S, A DIVR T, A STA quot - LDA ZERO ADDR S, A LOOP SUBR T, A .komentar5 @@ -34,7 +28,6 @@ LOOP SUBR T, A .komentar5 STA mod HALT J HALT END arithr - ZERO WORD 0 one BYTE 123 .KOMETA R sum RESW 1 @@ -43,5 +36,3 @@ prod RESW 1 quot RESW 1 .komentar6 mod RESW 1 WORD 400 . WER -.komentar7 - diff --git a/ass3/zbirnik/parsing/pregledovalnik.go b/ass3/zbirnik/parsing/pregledovalnik.go index b6648bf..ccfd88b 100644 --- a/ass3/zbirnik/parsing/pregledovalnik.go +++ b/ass3/zbirnik/parsing/pregledovalnik.go @@ -70,21 +70,27 @@ var ukazna_tabela = map[string]int{ "WD": 0xDC, } +var simbolna_tabela = map[string]int{} + +var ime_programa string + +var lc_global int + type ukaz interface { - Temp() + GetOznaka() string } -func (f format_F1) Temp() {} -func (f format_F2_n) Temp() {} -func (f format_F2_r) Temp() {} -func (f format_F2_rn) Temp() {} -func (f format_F2_rr) Temp() {} -func (f format_F3_m) Temp() {} -func (f format_F4_m) Temp() {} -func (f format_D) Temp() {} -func (f format_D_n) Temp() {} -func (f format_M_i) Temp() {} -func (f format_M_r) Temp() {} +func (f format_F1) GetOznaka() string { return f.oznaka } +func (f format_F2_n) GetOznaka() string { return f.oznaka } +func (f format_F2_r) GetOznaka() string { return f.oznaka } +func (f format_F2_rn) GetOznaka() string { return f.oznaka } +func (f format_F2_rr) GetOznaka() string { return f.oznaka } +func (f format_F3_m) GetOznaka() string { return f.oznaka } +func (f format_F4_m) GetOznaka() string { return f.oznaka } +func (f format_D) GetOznaka() string { return f.oznaka } +func (f format_D_n) GetOznaka() string { return f.oznaka } +func (f format_M_i) GetOznaka() string { return f.oznaka } +func (f format_M_r) GetOznaka() string { return f.oznaka } var register string = `A|X|L|B|S|T|F` @@ -93,6 +99,7 @@ type format_F1 struct { opcode int format int // F1 - 1, F2 - 2, F3 - 3, F4 - 4, SIC - 5 velikost int //v bajtih + lc int } type format_F2_n struct { @@ -101,6 +108,7 @@ type format_F2_n struct { format int // 2 velikost int n string + lc int } type format_F2_r struct { @@ -109,6 +117,7 @@ type format_F2_r struct { format int // 6 velikost int r1 string + lc int } type format_F2_rn struct { @@ -118,6 +127,7 @@ type format_F2_rn struct { velikost int r1 string n string + lc int } type format_F2_rr struct { @@ -127,6 +137,7 @@ type format_F2_rr struct { velikost int r1 string r2 string + lc int } type format_F3_m struct { @@ -141,6 +152,7 @@ type format_F3_m struct { e bool n bool i bool + lc int } type format_F4_m struct { @@ -155,6 +167,7 @@ type format_F4_m struct { e bool n bool i bool + lc int } type format_D struct { @@ -162,6 +175,7 @@ type format_D struct { ime string //NOBASE format int // 6 velikost int + lc int } type format_D_n struct { @@ -170,6 +184,7 @@ type format_D_n struct { format int // 7 velikost int operand string + lc int } type format_M_r struct { @@ -179,6 +194,7 @@ type format_M_r struct { velikost int operand string rezervacija int + lc int } type format_M_i struct { @@ -188,6 +204,7 @@ type format_M_i struct { velikost int operand string rezervacija int + lc int } func remove_comments_and_empty_lines(el string) bool { @@ -577,18 +594,66 @@ func check_M_i(el string, AST *[]ukaz) bool { nova_direktiva.velikost = 1 nova_direktiva.rezervacija = operand_int } - fmt.Println(el, nova_direktiva) + //fmt.Println(el, nova_direktiva) *AST = append(*AST, nova_direktiva) return true } return false } +func prvi_prehod(AST *[]ukaz) { + lc_global, _ = strconv.Atoi((*AST)[0].(format_D_n).operand) + ime_programa = (*AST)[0].(format_D_n).oznaka + for _, el := range *AST { + fmt.Println("lc_global", lc_global) + switch val := el.(type) { + case format_F1: val.lc = lc_global + lc_global += 1 + case format_F2_n: val.lc = lc_global + lc_global += 2 + case format_F2_r: val.lc = lc_global + lc_global += 2 + case format_F2_rn: val.lc = lc_global + lc_global += 2 + case format_F2_rr: val.lc = lc_global + lc_global += 2 + case format_F3_m: val.lc = lc_global + lc_global += 3 + case format_F4_m: val.lc = lc_global + lc_global += 4 + case format_D: val.lc = lc_global + case format_D_n: val.lc = lc_global + case format_M_r: val.lc = lc_global + lc_global += val.rezervacija + case format_M_i: val.lc = lc_global + lc_global += val.rezervacija + } + } +} + +func izpis(AST *[]ukaz) { + for _, el := range *AST { + switch val := el.(type) { + case format_F1: fmt.Println("F1", val) + case format_F2_n: fmt.Println("F2_n", val) + case format_F2_r: fmt.Println("F2_r", val) + case format_F2_rn: fmt.Println("F2_rn", val) + case format_F2_rr: fmt.Println("F2_rr", val) + case format_F3_m: fmt.Println("F3_m", val) + case format_F4_m: fmt.Println("F4_m", val) + case format_D: fmt.Println("D", val) + case format_D_n: fmt.Println("D_n", val) + case format_M_r: fmt.Println("M_r", val) + case format_M_i: fmt.Println("M_i", val) + } + } +} + // Pregledovalnik bere vhodne vrstice in jih razgradi na posamezne enote. // Razpoznane elemente okvalificira (oznaka / mnemonik / operand / komentar) // // ::== [] { } [] func main() { - inputbyte, err := os.ReadFile("input_invalid.asm") + inputbyte, err := os.ReadFile("input.asm") if err != nil { fmt.Println("Error reading input file: ", err) return @@ -637,9 +702,7 @@ func main() { continue } } + prvi_prehod(&AST) + izpis(&AST) + //drugi_prehod() } - - - - - diff --git a/ass3/zbirnik/parsing/test.obj b/ass3/zbirnik/parsing/test.obj index 7849bf4..653badd 100644 --- a/ass3/zbirnik/parsing/test.obj +++ b/ass3/zbirnik/parsing/test.obj @@ -1,4 +1,4 @@ -HPRG 00012C00001D +HPRG00012C00001D T00012C0F0100092500030300096B20053F2FFD T00013D0C000001000002000003000001 E00012C