type assertion in type switch nad AST pri 1. prehodu

This commit is contained in:
aljazbrodar. 2026-01-16 11:44:05 +01:00
parent 47f6a2ae5d
commit e6b0e22330
5 changed files with 144 additions and 65 deletions

View file

@ -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)
// //<zbirniski stavek> ::== [<oznaka stavka>] <ločilo> <mnemonik> <ločilo> {<operand> <ločilo>} [<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()
}