checkpoint
This commit is contained in:
parent
dadc137833
commit
3856635345
7 changed files with 241 additions and 35 deletions
|
|
@ -1,35 +1,32 @@
|
||||||
arithr START 0 .komentar1
|
arithr START 0 .komentar1
|
||||||
LDS #11 .komentar2
|
+LDX #10
|
||||||
|
SHIFTR A, 10, X
|
||||||
|
+LDS #11 .komentar2
|
||||||
LDT #5
|
LDT #5
|
||||||
.komentar3
|
.komentar3
|
||||||
LDA ZERO
|
LDA ZERO
|
||||||
ADDR S, A
|
ADDR S, A
|
||||||
ADDR T, A
|
ADDR T, A
|
||||||
STA sum
|
STA sum
|
||||||
FIX
|
|
||||||
FLOAT
|
|
||||||
.komentar4
|
.komentar4
|
||||||
LDA ZERO
|
LDA ZERO
|
||||||
|
+LDA ZERO, X .test
|
||||||
ADDR S, A
|
ADDR S, A
|
||||||
|
LDA 123, X . kom
|
||||||
SUBR T, A
|
SUBR T, A
|
||||||
STA diff
|
STA diff
|
||||||
HIO
|
|
||||||
LDA ZERO
|
LDA ZERO
|
||||||
ADDR S, A
|
ADDR S, A
|
||||||
MULR T, A
|
MULR T, A
|
||||||
STA prod
|
STA prod
|
||||||
|
|
||||||
SUBR A, X
|
+LDA ZERO
|
||||||
SHIFTR A, 10
|
|
||||||
SHIFTL X, #101
|
|
||||||
LA DIVR S, T . en komentar
|
|
||||||
LDA ZERO
|
|
||||||
ADDR S, A
|
ADDR S, A
|
||||||
lab SHIFTR A, 5
|
|
||||||
CLR SHIFTR L, 100 .komentar
|
|
||||||
DIVR T, A
|
DIVR T, A
|
||||||
STA quot
|
STA quot
|
||||||
FIX . s komentarjem
|
|
||||||
LDA ZERO
|
LDA ZERO
|
||||||
ADDR S, A
|
ADDR S, A
|
||||||
LOOP SUBR T, A .komentar5
|
LOOP SUBR T, A .komentar5
|
||||||
|
|
@ -37,12 +34,6 @@ LOOP SUBR T, A .komentar5
|
||||||
JGT LOOP
|
JGT LOOP
|
||||||
JEQ LOOP
|
JEQ LOOP
|
||||||
STA mod
|
STA mod
|
||||||
Lab SVC #100
|
|
||||||
lab CLEAR A
|
|
||||||
SVC 10
|
|
||||||
TIXR S
|
|
||||||
test SVC @300 . se en komentar
|
|
||||||
LA TIXR T . komentar at the end
|
|
||||||
HALT J HALT
|
HALT J HALT
|
||||||
END arithr
|
END arithr
|
||||||
|
|
||||||
|
|
@ -53,3 +44,4 @@ prod RESW 1
|
||||||
quot RESW 1 .komentar6
|
quot RESW 1 .komentar6
|
||||||
mod RESW 1
|
mod RESW 1
|
||||||
.komentar7
|
.komentar7
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,12 @@ func (f format_F2_n) Temp() {}
|
||||||
func (f format_F2_r) Temp() {}
|
func (f format_F2_r) Temp() {}
|
||||||
func (f format_F2_rn) Temp() {}
|
func (f format_F2_rn) Temp() {}
|
||||||
func (f format_F2_rr) 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() {}
|
||||||
|
|
||||||
var register string = `A|X|L|B|S|T|F`
|
var register string = `A|X|L|B|S|T|F`
|
||||||
|
|
||||||
|
|
@ -92,7 +97,7 @@ type format_F1 struct {
|
||||||
type format_F2_n struct {
|
type format_F2_n struct {
|
||||||
oznaka string
|
oznaka string
|
||||||
opcode int
|
opcode int
|
||||||
format int
|
format int // 2
|
||||||
velikost int
|
velikost int
|
||||||
n string
|
n string
|
||||||
}
|
}
|
||||||
|
|
@ -100,7 +105,7 @@ type format_F2_n struct {
|
||||||
type format_F2_r struct {
|
type format_F2_r struct {
|
||||||
oznaka string
|
oznaka string
|
||||||
opcode int
|
opcode int
|
||||||
format int
|
format int // 6
|
||||||
velikost int
|
velikost int
|
||||||
r1 string
|
r1 string
|
||||||
}
|
}
|
||||||
|
|
@ -108,7 +113,7 @@ type format_F2_r struct {
|
||||||
type format_F2_rn struct {
|
type format_F2_rn struct {
|
||||||
oznaka string
|
oznaka string
|
||||||
opcode int
|
opcode int
|
||||||
format int
|
format int // 2
|
||||||
velikost int
|
velikost int
|
||||||
r1 string
|
r1 string
|
||||||
n string
|
n string
|
||||||
|
|
@ -117,7 +122,7 @@ type format_F2_rn struct {
|
||||||
type format_F2_rr struct {
|
type format_F2_rr struct {
|
||||||
oznaka string
|
oznaka string
|
||||||
opcode int
|
opcode int
|
||||||
format int
|
format int // 2
|
||||||
velikost int
|
velikost int
|
||||||
r1 string
|
r1 string
|
||||||
r2 string
|
r2 string
|
||||||
|
|
@ -126,7 +131,7 @@ type format_F2_rr struct {
|
||||||
type format_F3_m struct {
|
type format_F3_m struct {
|
||||||
oznaka string
|
oznaka string
|
||||||
opcode int
|
opcode int
|
||||||
format int
|
format int // 3
|
||||||
velikost int
|
velikost int
|
||||||
naslov string
|
naslov string
|
||||||
x bool
|
x bool
|
||||||
|
|
@ -137,6 +142,47 @@ type format_F3_m struct {
|
||||||
i bool
|
i bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type format_F4_m struct {
|
||||||
|
oznaka string
|
||||||
|
opcode int
|
||||||
|
format int // 4
|
||||||
|
velikost int
|
||||||
|
naslov string
|
||||||
|
x bool
|
||||||
|
b bool
|
||||||
|
p bool
|
||||||
|
e bool
|
||||||
|
n bool
|
||||||
|
i bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type format_D struct {
|
||||||
|
oznaka string
|
||||||
|
format int // 6
|
||||||
|
velikost int
|
||||||
|
}
|
||||||
|
|
||||||
|
type format_D_n struct {
|
||||||
|
oznaka string
|
||||||
|
format int // 7
|
||||||
|
velikost int
|
||||||
|
operand string
|
||||||
|
}
|
||||||
|
|
||||||
|
type format_M_r struct {
|
||||||
|
oznaka string
|
||||||
|
format int // 8
|
||||||
|
velikost int
|
||||||
|
operand string
|
||||||
|
}
|
||||||
|
|
||||||
|
type format_M_i struct {
|
||||||
|
oznaka string
|
||||||
|
format int // 9
|
||||||
|
velikost int
|
||||||
|
operand string
|
||||||
|
}
|
||||||
|
|
||||||
func remove_comments_and_empty_lines(el string) bool {
|
func remove_comments_and_empty_lines(el string) bool {
|
||||||
match_pure_comment, err := regexp.MatchString(`(?m)^[\t ]*\..*$\n`, el)
|
match_pure_comment, err := regexp.MatchString(`(?m)^[\t ]*\..*$\n`, el)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -166,7 +212,12 @@ func check_F1(el string, AST *[]ukaz) bool {
|
||||||
nov_ukaz.velikost = 1
|
nov_ukaz.velikost = 1
|
||||||
pattern := regexp.MustCompile(`[\t ]+[A-Za-z]+`)
|
pattern := regexp.MustCompile(`[\t ]+[A-Za-z]+`)
|
||||||
mnemonik := strings.Trim(pattern.FindString(el), "\t ")
|
mnemonik := strings.Trim(pattern.FindString(el), "\t ")
|
||||||
nov_ukaz.opcode = ukazna_tabela[mnemonik];
|
val, ok := ukazna_tabela[mnemonik];
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("Error: Opcode not found.")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
nov_ukaz.opcode = val
|
||||||
//fmt.Println("F1: ", mnemonik, nov_ukaz.opcode)
|
//fmt.Println("F1: ", mnemonik, nov_ukaz.opcode)
|
||||||
*AST = append(*AST, nov_ukaz)
|
*AST = append(*AST, nov_ukaz)
|
||||||
return true
|
return true
|
||||||
|
|
@ -220,7 +271,12 @@ func check_F2_r(el string, AST *[]ukaz) bool {
|
||||||
nov_ukaz.oznaka = ""
|
nov_ukaz.oznaka = ""
|
||||||
}
|
}
|
||||||
re_op := regexp.MustCompile(`[\t ]+[A-Za-z]+`)
|
re_op := regexp.MustCompile(`[\t ]+[A-Za-z]+`)
|
||||||
nov_ukaz.opcode = ukazna_tabela[strings.Trim(re_op.FindString(el), "\t ")]
|
val, ok := ukazna_tabela[strings.Trim(re_op.FindString(el), "\t ")]
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("Error: Opcode not found.")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
nov_ukaz.opcode = val
|
||||||
re_par := regexp.MustCompile(`[\t ]+[A-Za-z]+ (`+register+`)`)
|
re_par := regexp.MustCompile(`[\t ]+[A-Za-z]+ (`+register+`)`)
|
||||||
nov_ukaz.r1 = strings.Split(strings.Trim(re_par.FindString(el), "\t \n"), " ")[1]
|
nov_ukaz.r1 = strings.Split(strings.Trim(re_par.FindString(el), "\t \n"), " ")[1]
|
||||||
//fmt.Println(nov_ukaz)
|
//fmt.Println(nov_ukaz)
|
||||||
|
|
@ -246,7 +302,12 @@ func check_F2_rn(el string, AST *[]ukaz) bool {
|
||||||
nov_ukaz.oznaka = ""
|
nov_ukaz.oznaka = ""
|
||||||
}
|
}
|
||||||
re_op := regexp.MustCompile(`[\t ]+[A-Za-z]+`)
|
re_op := regexp.MustCompile(`[\t ]+[A-Za-z]+`)
|
||||||
nov_ukaz.opcode = ukazna_tabela[strings.Trim(re_op.FindString(el), "\t ")]
|
val, ok := ukazna_tabela[strings.Trim(re_op.FindString(el), "\t ")]
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("Error: Opcode not found.")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
nov_ukaz.opcode = val
|
||||||
re_par1 := regexp.MustCompile(`[\t ]+[A-Za-z]+ (`+register+`)`)
|
re_par1 := regexp.MustCompile(`[\t ]+[A-Za-z]+ (`+register+`)`)
|
||||||
nov_ukaz.r1 = strings.Split(strings.Trim(re_par1.FindString(el), "\t \n"), " ")[1]
|
nov_ukaz.r1 = strings.Split(strings.Trim(re_par1.FindString(el), "\t \n"), " ")[1]
|
||||||
re_par2 := regexp.MustCompile(`(`+register+`), ([0-9]+),?`)
|
re_par2 := regexp.MustCompile(`(`+register+`), ([0-9]+),?`)
|
||||||
|
|
@ -279,7 +340,12 @@ func check_F2_rr(el string, AST *[]ukaz) bool {
|
||||||
nov_ukaz.oznaka = ""
|
nov_ukaz.oznaka = ""
|
||||||
}
|
}
|
||||||
re_op := regexp.MustCompile(`[\t ]+[A-Za-z]+`)
|
re_op := regexp.MustCompile(`[\t ]+[A-Za-z]+`)
|
||||||
nov_ukaz.opcode = ukazna_tabela[strings.Trim(re_op.FindString(el), "\t ")]
|
val, ok := ukazna_tabela[strings.Trim(re_op.FindString(el), "\t ")]
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("Error: Opcode not found.")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
nov_ukaz.opcode = val
|
||||||
re_par1 := regexp.MustCompile(`[\t ]+[A-Za-z]+ (`+register+`)`)
|
re_par1 := regexp.MustCompile(`[\t ]+[A-Za-z]+ (`+register+`)`)
|
||||||
nov_ukaz.r1 = strings.Split(strings.Trim(re_par1.FindString(el), "\t \n"), " ")[1]
|
nov_ukaz.r1 = strings.Split(strings.Trim(re_par1.FindString(el), "\t \n"), " ")[1]
|
||||||
re_par2 := regexp.MustCompile(`(`+register+`), (`+register+`)`)
|
re_par2 := regexp.MustCompile(`(`+register+`), (`+register+`)`)
|
||||||
|
|
@ -292,7 +358,128 @@ func check_F2_rr(el string, AST *[]ukaz) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func check_F3_m(el string, AST *[]ukaz) bool {
|
func check_F3_m(el string, AST *[]ukaz) bool {
|
||||||
|
match_F3_m, err := regexp.MatchString(`(?m)^[A-Za-z_]*[\t ]+[A-Za-z]+ ([A-Za-z]+|(#?|@?)[0-9+]+)(, X)?[\t ]*(\..*)?$\n`, el)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error while matching string.")
|
||||||
|
}
|
||||||
|
if match_F3_m {
|
||||||
|
var nov_ukaz format_F3_m
|
||||||
|
nov_ukaz.format = 3
|
||||||
|
nov_ukaz.velikost = 3
|
||||||
|
if !(strings.HasPrefix(el, " ") || strings.HasPrefix(el, "\t")) {
|
||||||
|
re := regexp.MustCompile(`(?m)^[A-Za-z]+`)
|
||||||
|
nov_ukaz.oznaka = re.FindString(el)
|
||||||
|
} else {
|
||||||
|
nov_ukaz.oznaka = ""
|
||||||
|
}
|
||||||
|
re_op := regexp.MustCompile(`[\t ]+[A-Za-z]+`)
|
||||||
|
val, ok := ukazna_tabela[strings.Trim(re_op.FindString(el), "\t ")]
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("Error: Opcode not found.")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
nov_ukaz.opcode = val
|
||||||
|
// naslov
|
||||||
|
re_par1 := regexp.MustCompile(`[\t ]+[A-Za-z]+ ([A-Za-z]+|(#?|@?)[0-9+]+)`)
|
||||||
|
nov_ukaz.naslov = strings.Split(strings.Trim(re_par1.FindString(el), "\t \n"), " ")[1]
|
||||||
|
if nov_ukaz.naslov[0] == '@' {
|
||||||
|
nov_ukaz.n = true
|
||||||
|
nov_ukaz.i = false
|
||||||
|
nov_ukaz.naslov = nov_ukaz.naslov[1:len(nov_ukaz.naslov)]
|
||||||
|
} else if nov_ukaz.naslov[0] == '#' {
|
||||||
|
nov_ukaz.n = false
|
||||||
|
nov_ukaz.i = true
|
||||||
|
nov_ukaz.naslov = nov_ukaz.naslov[1:len(nov_ukaz.naslov)]
|
||||||
|
} else {
|
||||||
|
//temp
|
||||||
|
nov_ukaz.n = false
|
||||||
|
nov_ukaz.i = false
|
||||||
|
}
|
||||||
|
// indeksno naslavljanje
|
||||||
|
re_x := regexp.MustCompile(`(, X)[\t ]*(\..*)?\n`)
|
||||||
|
if re_x.FindString(el) != "" {
|
||||||
|
nov_ukaz.x = true
|
||||||
|
} else {
|
||||||
|
nov_ukaz.x = false
|
||||||
|
}
|
||||||
|
nov_ukaz.e = false
|
||||||
|
//fmt.Println(el, nov_ukaz)
|
||||||
|
*AST = append(*AST, nov_ukaz)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func check_F4_m(el string, AST *[]ukaz) bool {
|
||||||
|
match_F4_m, err := regexp.MatchString(`(?m)^[A-Za-z_]*[\t ]+\+[A-Za-z]+ ([A-Za-z]+|(#?|@?)[0-9+]+)(, X)?[\t ]*(\..*)?$\n`, el)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error while matching string.")
|
||||||
|
}
|
||||||
|
if match_F4_m {
|
||||||
|
var nov_ukaz format_F4_m
|
||||||
|
nov_ukaz.format = 4
|
||||||
|
nov_ukaz.velikost = 4
|
||||||
|
if !(strings.HasPrefix(el, " ") || strings.HasPrefix(el, "\t")) {
|
||||||
|
re := regexp.MustCompile(`(?m)^[A-Za-z]+`)
|
||||||
|
nov_ukaz.oznaka = re.FindString(el)
|
||||||
|
} else {
|
||||||
|
nov_ukaz.oznaka = ""
|
||||||
|
}
|
||||||
|
re_op := regexp.MustCompile(`[\t ]+\+[A-Za-z]+`)
|
||||||
|
// skip "+"
|
||||||
|
val, ok := ukazna_tabela[strings.Trim(re_op.FindString(el), "\t +")]
|
||||||
|
if !ok {
|
||||||
|
fmt.Println("Error: Opcode not found.")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
nov_ukaz.opcode = val
|
||||||
|
// naslov
|
||||||
|
re_par1 := regexp.MustCompile(`[\t ]+\+[A-Za-z]+ ([A-Za-z]+|(#?|@?)[0-9+]+)`)
|
||||||
|
nov_ukaz.naslov = strings.Split(strings.Trim(re_par1.FindString(el), "\t \n"), " ")[1]
|
||||||
|
if nov_ukaz.naslov[0] == '@' {
|
||||||
|
nov_ukaz.n = true
|
||||||
|
nov_ukaz.i = false
|
||||||
|
nov_ukaz.naslov = nov_ukaz.naslov[1:len(nov_ukaz.naslov)]
|
||||||
|
} else if nov_ukaz.naslov[0] == '#' {
|
||||||
|
nov_ukaz.n = false
|
||||||
|
nov_ukaz.i = true
|
||||||
|
nov_ukaz.naslov = nov_ukaz.naslov[1:len(nov_ukaz.naslov)]
|
||||||
|
} else {
|
||||||
|
nov_ukaz.n = false
|
||||||
|
nov_ukaz.i = false
|
||||||
|
}
|
||||||
|
// indeksno naslavljanje
|
||||||
|
re_x := regexp.MustCompile(`(, X)[\t ]*(\..*)?\n`)
|
||||||
|
if re_x.FindString(el) != "" {
|
||||||
|
nov_ukaz.x = true
|
||||||
|
} else {
|
||||||
|
nov_ukaz.x = false
|
||||||
|
}
|
||||||
|
nov_ukaz.e = true
|
||||||
|
fmt.Println(el, nov_ukaz)
|
||||||
|
*AST = append(*AST, nov_ukaz)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func check_D(el string, AST *[]ukaz) {
|
||||||
|
match_D, err := regexp.MatchString(`(?m)^[A-Za-z_]*[\t ]+NOBASE[\t ]*(\..*)?$\n`, el)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error while matching string.")
|
||||||
|
}
|
||||||
|
if match_D {
|
||||||
|
var nova_direktiva format_D
|
||||||
|
if !(strings.HasPrefix(el, " ") || strings.HasPrefix(el, "\t")) {
|
||||||
|
re := regexp.MustCompile(`(?m)^[A-Za-z]+`)
|
||||||
|
nov_direktiva.oznaka = re.FindString(el)
|
||||||
|
} else {
|
||||||
|
nov_direktiva.oznaka = ""
|
||||||
|
}
|
||||||
|
*AST = append(*AST, nova_direktiva)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pregledovalnik bere vhodne vrstice in jih razgradi na posamezne enote.
|
// Pregledovalnik bere vhodne vrstice in jih razgradi na posamezne enote.
|
||||||
|
|
@ -314,6 +501,9 @@ func main() {
|
||||||
if remove_comments_and_empty_lines(el) {
|
if remove_comments_and_empty_lines(el) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if check_D(el, &AST) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if check_F1(el, &AST) {
|
if check_F1(el, &AST) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
@ -329,8 +519,15 @@ func main() {
|
||||||
if check_F2_rr(el, &AST) {
|
if check_F2_rr(el, &AST) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// !!! direktivo START je treba preveriti pred F3, sicer jo bo dalo sem
|
||||||
if check_F3_m(el, &AST) {
|
if check_F3_m(el, &AST) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if check_F4_m(el, &AST) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
17
ass3/zbirnik/parsing/test.asm
Normal file
17
ass3/zbirnik/parsing/test.asm
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
PRG START 300
|
||||||
|
LDA #bytes_len
|
||||||
|
DIV #3
|
||||||
|
LDA bytes_len
|
||||||
|
LDB #tab
|
||||||
|
BASE #tab
|
||||||
|
NOBASE
|
||||||
|
HALT J HALT
|
||||||
|
END PRG
|
||||||
|
|
||||||
|
tab0 RESB 2
|
||||||
|
tab WORD 1
|
||||||
|
WORD 2
|
||||||
|
WORD 3
|
||||||
|
test EQU *
|
||||||
|
bytes_len EQU test - tab
|
||||||
|
tab2 WORD 1
|
||||||
|
|
@ -5,10 +5,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
i := "tes,"
|
ut := make(map[string]int)
|
||||||
if i[len(i)-1] == ',' {
|
ut["nov"] = 300
|
||||||
fmt.Println("hi")
|
val, ok := ut["nov"]
|
||||||
} else {
|
fmt.Println(val, ok)
|
||||||
fmt.Println("world")
|
val2, ok2 := ut["nova"]
|
||||||
}
|
fmt.Println(val2, ok2)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
0
ass3/zbirnik/parsing/test.log
Normal file
0
ass3/zbirnik/parsing/test.log
Normal file
0
ass3/zbirnik/parsing/test.lst
Normal file
0
ass3/zbirnik/parsing/test.lst
Normal file
0
ass3/zbirnik/parsing/test.obj
Normal file
0
ass3/zbirnik/parsing/test.obj
Normal file
Loading…
Add table
Add a link
Reference in a new issue