type assertion in type switch nad AST pri 1. prehodu
This commit is contained in:
parent
47f6a2ae5d
commit
e6b0e22330
5 changed files with 144 additions and 65 deletions
37
ass3/zbirnik/parsing/delme.txt
Normal file
37
ass3/zbirnik/parsing/delme.txt
Normal file
|
|
@ -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}
|
||||||
|
|
@ -1,44 +1,32 @@
|
||||||
arithr START 0 .komentar1
|
arith START 0
|
||||||
LDX #10
|
LDA x
|
||||||
SHIFTR A, 10, X
|
ADD y
|
||||||
LDS #11 .komentar2
|
STA sum
|
||||||
LDT #5
|
LDA x
|
||||||
.komentar3
|
SUB y
|
||||||
LDA ZERO
|
|
||||||
ADDR S, A
|
|
||||||
ADDR T, A
|
|
||||||
STA sum
|
|
||||||
|
|
||||||
.komentar4
|
|
||||||
LDA ZERO
|
|
||||||
ADDR S, A
|
|
||||||
SUBR T, A
|
|
||||||
STA diff
|
STA diff
|
||||||
|
|
||||||
LDA ZERO
|
LDA x
|
||||||
ADDR S, A
|
MUL y
|
||||||
MULR T, A
|
|
||||||
STA prod
|
STA prod
|
||||||
|
|
||||||
LDA ZERO
|
LDA x
|
||||||
ADDR S, A
|
DIV y
|
||||||
DIVR T, A
|
|
||||||
STA quot
|
STA quot
|
||||||
|
|
||||||
LDA ZERO
|
LDA y
|
||||||
ADDR S, A
|
MUL quot
|
||||||
LOOP SUBR T, A .komentar5
|
STA mod
|
||||||
COMPR A, T
|
LDA x
|
||||||
JGT LOOP
|
SUB mod
|
||||||
JEQ LOOP
|
STA mod
|
||||||
STA mod
|
HALT J HALT
|
||||||
HALT J HALT
|
END arith
|
||||||
END arithr
|
|
||||||
|
|
||||||
ZERO WORD 0
|
x WORD 11
|
||||||
|
y WORD 5
|
||||||
sum RESW 1
|
sum RESW 1
|
||||||
diff RESW 1
|
diff RESW 1
|
||||||
prod RESW 1
|
prod RESW 1
|
||||||
quot RESW 1 .komentar6
|
quot RESW 1
|
||||||
mod RESW 1
|
mod RESW 1
|
||||||
.komentar7
|
|
||||||
|
|
|
||||||
|
|
@ -1,30 +1,24 @@
|
||||||
arithr START 0 .komentar1
|
arithr START 0 .komentar1
|
||||||
LDX #10
|
LDX #10
|
||||||
SHIFTR A, 10, X
|
SHIFTR A, 10
|
||||||
LDS #11 .komentar2
|
LDS #11 .komentar2
|
||||||
LDT #5
|
LDT #5
|
||||||
.komentar3
|
|
||||||
LDA ZERO
|
LDA ZERO
|
||||||
ADDR S, A
|
ADDR S, A
|
||||||
ADDR T, A
|
ADDR T, A
|
||||||
STA sum
|
STA sum
|
||||||
|
|
||||||
.komentar4
|
|
||||||
LDA ZERO
|
LDA ZERO
|
||||||
ADDR S, A
|
ADDR S, A
|
||||||
SUBR T, A
|
SUBR T, A
|
||||||
STA diff
|
STA diff
|
||||||
|
|
||||||
LDA ZERO
|
LDA ZERO
|
||||||
ADDR S, A
|
ADDR S, A
|
||||||
MULR T, A
|
MULR T, A
|
||||||
STA prod
|
STA prod
|
||||||
|
|
||||||
LDA ZERO
|
LDA ZERO
|
||||||
ADDR S, A
|
ADDR S, A
|
||||||
DIVR T, A
|
DIVR T, A
|
||||||
STA quot
|
STA quot
|
||||||
|
|
||||||
LDA ZERO
|
LDA ZERO
|
||||||
ADDR S, A
|
ADDR S, A
|
||||||
LOOP SUBR T, A .komentar5
|
LOOP SUBR T, A .komentar5
|
||||||
|
|
@ -34,7 +28,6 @@ LOOP SUBR T, A .komentar5
|
||||||
STA mod
|
STA mod
|
||||||
HALT J HALT
|
HALT J HALT
|
||||||
END arithr
|
END arithr
|
||||||
|
|
||||||
ZERO WORD 0
|
ZERO WORD 0
|
||||||
one BYTE 123 .KOMETA R
|
one BYTE 123 .KOMETA R
|
||||||
sum RESW 1
|
sum RESW 1
|
||||||
|
|
@ -43,5 +36,3 @@ prod RESW 1
|
||||||
quot RESW 1 .komentar6
|
quot RESW 1 .komentar6
|
||||||
mod RESW 1
|
mod RESW 1
|
||||||
WORD 400 . WER
|
WORD 400 . WER
|
||||||
.komentar7
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,21 +70,27 @@ var ukazna_tabela = map[string]int{
|
||||||
"WD": 0xDC,
|
"WD": 0xDC,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var simbolna_tabela = map[string]int{}
|
||||||
|
|
||||||
|
var ime_programa string
|
||||||
|
|
||||||
|
var lc_global int
|
||||||
|
|
||||||
type ukaz interface {
|
type ukaz interface {
|
||||||
Temp()
|
GetOznaka() string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f format_F1) Temp() {}
|
func (f format_F1) GetOznaka() string { return f.oznaka }
|
||||||
func (f format_F2_n) Temp() {}
|
func (f format_F2_n) GetOznaka() string { return f.oznaka }
|
||||||
func (f format_F2_r) Temp() {}
|
func (f format_F2_r) GetOznaka() string { return f.oznaka }
|
||||||
func (f format_F2_rn) Temp() {}
|
func (f format_F2_rn) GetOznaka() string { return f.oznaka }
|
||||||
func (f format_F2_rr) Temp() {}
|
func (f format_F2_rr) GetOznaka() string { return f.oznaka }
|
||||||
func (f format_F3_m) Temp() {}
|
func (f format_F3_m) GetOznaka() string { return f.oznaka }
|
||||||
func (f format_F4_m) Temp() {}
|
func (f format_F4_m) GetOznaka() string { return f.oznaka }
|
||||||
func (f format_D) Temp() {}
|
func (f format_D) GetOznaka() string { return f.oznaka }
|
||||||
func (f format_D_n) Temp() {}
|
func (f format_D_n) GetOznaka() string { return f.oznaka }
|
||||||
func (f format_M_i) Temp() {}
|
func (f format_M_i) GetOznaka() string { return f.oznaka }
|
||||||
func (f format_M_r) Temp() {}
|
func (f format_M_r) GetOznaka() string { return f.oznaka }
|
||||||
|
|
||||||
var register string = `A|X|L|B|S|T|F`
|
var register string = `A|X|L|B|S|T|F`
|
||||||
|
|
||||||
|
|
@ -93,6 +99,7 @@ type format_F1 struct {
|
||||||
opcode int
|
opcode int
|
||||||
format int // F1 - 1, F2 - 2, F3 - 3, F4 - 4, SIC - 5
|
format int // F1 - 1, F2 - 2, F3 - 3, F4 - 4, SIC - 5
|
||||||
velikost int //v bajtih
|
velikost int //v bajtih
|
||||||
|
lc int
|
||||||
}
|
}
|
||||||
|
|
||||||
type format_F2_n struct {
|
type format_F2_n struct {
|
||||||
|
|
@ -101,6 +108,7 @@ type format_F2_n struct {
|
||||||
format int // 2
|
format int // 2
|
||||||
velikost int
|
velikost int
|
||||||
n string
|
n string
|
||||||
|
lc int
|
||||||
}
|
}
|
||||||
|
|
||||||
type format_F2_r struct {
|
type format_F2_r struct {
|
||||||
|
|
@ -109,6 +117,7 @@ type format_F2_r struct {
|
||||||
format int // 6
|
format int // 6
|
||||||
velikost int
|
velikost int
|
||||||
r1 string
|
r1 string
|
||||||
|
lc int
|
||||||
}
|
}
|
||||||
|
|
||||||
type format_F2_rn struct {
|
type format_F2_rn struct {
|
||||||
|
|
@ -118,6 +127,7 @@ type format_F2_rn struct {
|
||||||
velikost int
|
velikost int
|
||||||
r1 string
|
r1 string
|
||||||
n string
|
n string
|
||||||
|
lc int
|
||||||
}
|
}
|
||||||
|
|
||||||
type format_F2_rr struct {
|
type format_F2_rr struct {
|
||||||
|
|
@ -127,6 +137,7 @@ type format_F2_rr struct {
|
||||||
velikost int
|
velikost int
|
||||||
r1 string
|
r1 string
|
||||||
r2 string
|
r2 string
|
||||||
|
lc int
|
||||||
}
|
}
|
||||||
|
|
||||||
type format_F3_m struct {
|
type format_F3_m struct {
|
||||||
|
|
@ -141,6 +152,7 @@ type format_F3_m struct {
|
||||||
e bool
|
e bool
|
||||||
n bool
|
n bool
|
||||||
i bool
|
i bool
|
||||||
|
lc int
|
||||||
}
|
}
|
||||||
|
|
||||||
type format_F4_m struct {
|
type format_F4_m struct {
|
||||||
|
|
@ -155,6 +167,7 @@ type format_F4_m struct {
|
||||||
e bool
|
e bool
|
||||||
n bool
|
n bool
|
||||||
i bool
|
i bool
|
||||||
|
lc int
|
||||||
}
|
}
|
||||||
|
|
||||||
type format_D struct {
|
type format_D struct {
|
||||||
|
|
@ -162,6 +175,7 @@ type format_D struct {
|
||||||
ime string //NOBASE
|
ime string //NOBASE
|
||||||
format int // 6
|
format int // 6
|
||||||
velikost int
|
velikost int
|
||||||
|
lc int
|
||||||
}
|
}
|
||||||
|
|
||||||
type format_D_n struct {
|
type format_D_n struct {
|
||||||
|
|
@ -170,6 +184,7 @@ type format_D_n struct {
|
||||||
format int // 7
|
format int // 7
|
||||||
velikost int
|
velikost int
|
||||||
operand string
|
operand string
|
||||||
|
lc int
|
||||||
}
|
}
|
||||||
|
|
||||||
type format_M_r struct {
|
type format_M_r struct {
|
||||||
|
|
@ -179,6 +194,7 @@ type format_M_r struct {
|
||||||
velikost int
|
velikost int
|
||||||
operand string
|
operand string
|
||||||
rezervacija int
|
rezervacija int
|
||||||
|
lc int
|
||||||
}
|
}
|
||||||
|
|
||||||
type format_M_i struct {
|
type format_M_i struct {
|
||||||
|
|
@ -188,6 +204,7 @@ type format_M_i struct {
|
||||||
velikost int
|
velikost int
|
||||||
operand string
|
operand string
|
||||||
rezervacija int
|
rezervacija int
|
||||||
|
lc int
|
||||||
}
|
}
|
||||||
|
|
||||||
func remove_comments_and_empty_lines(el string) bool {
|
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.velikost = 1
|
||||||
nova_direktiva.rezervacija = operand_int
|
nova_direktiva.rezervacija = operand_int
|
||||||
}
|
}
|
||||||
fmt.Println(el, nova_direktiva)
|
//fmt.Println(el, nova_direktiva)
|
||||||
*AST = append(*AST, nova_direktiva)
|
*AST = append(*AST, nova_direktiva)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
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.
|
// Pregledovalnik bere vhodne vrstice in jih razgradi na posamezne enote.
|
||||||
// Razpoznane elemente okvalificira (oznaka / mnemonik / operand / komentar)
|
// Razpoznane elemente okvalificira (oznaka / mnemonik / operand / komentar)
|
||||||
// //<zbirniski stavek> ::== [<oznaka stavka>] <ločilo> <mnemonik> <ločilo> {<operand> <ločilo>} [<komentar>]
|
// //<zbirniski stavek> ::== [<oznaka stavka>] <ločilo> <mnemonik> <ločilo> {<operand> <ločilo>} [<komentar>]
|
||||||
func main() {
|
func main() {
|
||||||
inputbyte, err := os.ReadFile("input_invalid.asm")
|
inputbyte, err := os.ReadFile("input.asm")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error reading input file: ", err)
|
fmt.Println("Error reading input file: ", err)
|
||||||
return
|
return
|
||||||
|
|
@ -637,9 +702,7 @@ func main() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
prvi_prehod(&AST)
|
||||||
|
izpis(&AST)
|
||||||
|
//drugi_prehod()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
HPRG 00012C00001D
|
HPRG00012C00001D
|
||||||
T00012C0F0100092500030300096B20053F2FFD
|
T00012C0F0100092500030300096B20053F2FFD
|
||||||
T00013D0C000001000002000003000001
|
T00013D0C000001000002000003000001
|
||||||
E00012C
|
E00012C
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue