From 47f6a2ae5d148be61f710fd171d474a1c2c7b901 Mon Sep 17 00:00:00 2001 From: "aljazbrodar." Date: Thu, 15 Jan 2026 18:35:12 +0100 Subject: [PATCH] basic parsing done --- ass3/zbirnik/parsing/input_invalid.asm | 29 +++++------- ass3/zbirnik/parsing/pregledovalnik.go | 61 +++++++++++++++++++++++++- ass3/zbirnik/parsing/test.go | 11 +++-- 3 files changed, 76 insertions(+), 25 deletions(-) diff --git a/ass3/zbirnik/parsing/input_invalid.asm b/ass3/zbirnik/parsing/input_invalid.asm index 6888b19..e2d3c09 100644 --- a/ass3/zbirnik/parsing/input_invalid.asm +++ b/ass3/zbirnik/parsing/input_invalid.asm @@ -1,33 +1,26 @@ arithr START 0 .komentar1 - LDX #10 + LDX #10 SHIFTR A, 10, X LDS #11 .komentar2 LDT #5 - NOBASE .koment - NOBASE - BASE ZERO .KOMENTAR - ORG tab-tab -LAB NOBASE - EQU -LAB NOBASE .koment .komentar3 LDA ZERO ADDR S, A ADDR T, A - STA sum - + STA sum + .komentar4 - LDA ZERO - ADDR S, A + LDA ZERO + ADDR S, A SUBR T, A STA diff - LDA ZERO + LDA ZERO ADDR S, A MULR T, A STA prod - LDA ZERO + LDA ZERO ADDR S, A DIVR T, A STA quot @@ -38,15 +31,17 @@ LOOP SUBR T, A .komentar5 COMPR A, T JGT LOOP JEQ LOOP - STA mod -HALT J HALT + STA mod +HALT J HALT END arithr -ZERO WORD 0 +ZERO WORD 0 +one BYTE 123 .KOMETA R sum RESW 1 diff RESW 1 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 a0ca3d7..b6648bf 100644 --- a/ass3/zbirnik/parsing/pregledovalnik.go +++ b/ass3/zbirnik/parsing/pregledovalnik.go @@ -5,6 +5,7 @@ import ( "os" "regexp" "strings" + "strconv" ) var ukazna_tabela = map[string]int{ @@ -177,6 +178,7 @@ type format_M_r struct { format int // 8 velikost int operand string + rezervacija int } type format_M_i struct { @@ -185,6 +187,7 @@ type format_M_i struct { format int // 9 velikost int operand string + rezervacija int } func remove_comments_and_empty_lines(el string) bool { @@ -522,11 +525,60 @@ func check_M_r(el string, AST *[]ukaz) bool { fmt.Println("Error while matching string.") } if match_M_r { - var nova_direktiva format_D_n + var nova_direktiva format_M_r re_ime := regexp.MustCompile(`RESW|RESB`) nova_direktiva.ime = re_ime.FindString(el) nova_direktiva.format = 8 - //predpostavi celostevilski operand in doloci velikost + nova_direktiva.velikost = 0 + if !(strings.HasPrefix(el, " ") || strings.HasPrefix(el, "\t")) { + re := regexp.MustCompile(`(?m)^[A-Za-z]+`) + nova_direktiva.oznaka = re.FindString(el) + } else { + nova_direktiva.oznaka = "" + } + re_ope := regexp.MustCompile(`[0-9]+`) + nova_direktiva.operand = re_ope.FindString(el) + operand_int, _ := strconv.Atoi(nova_direktiva.operand) + if nova_direktiva.ime == "RESW" { + nova_direktiva.rezervacija = 3 * operand_int + } else { + nova_direktiva.rezervacija = operand_int + } + //fmt.Println(el, nova_direktiva) + *AST = append(*AST, nova_direktiva) + return true + } + return false +} + +func check_M_i(el string, AST *[]ukaz) bool { + match_M_i, err := regexp.MatchString(`(?m)^[A-Za-z]*[\t ]+(WORD|BYTE) ([0-9]+)[\t ]*(\..*)?$\n`, el) + if err != nil { + fmt.Println("Error while matching string.") + } + if match_M_i { + var nova_direktiva format_M_i + re_ime := regexp.MustCompile(`WORD|BYTE`) + nova_direktiva.ime = re_ime.FindString(el) + nova_direktiva.format = 9 + if !(strings.HasPrefix(el, " ") || strings.HasPrefix(el, "\t")) { + re := regexp.MustCompile(`(?m)^[A-Za-z]+`) + nova_direktiva.oznaka = re.FindString(el) + } else { + nova_direktiva.oznaka = "" + } + re_ope := regexp.MustCompile(`[0-9]+`) + nova_direktiva.operand = re_ope.FindString(el) + operand_int, _ := strconv.Atoi(nova_direktiva.operand) + if nova_direktiva.ime == "WORD" { + nova_direktiva.velikost = 3 + nova_direktiva.rezervacija = 3 * operand_int + } else { + nova_direktiva.velikost = 1 + nova_direktiva.rezervacija = operand_int + } + fmt.Println(el, nova_direktiva) + *AST = append(*AST, nova_direktiva) return true } return false @@ -560,6 +612,9 @@ func main() { if check_M_r(el, &AST) { continue } + if check_M_i(el, &AST) { + continue + } if check_F1(el, &AST) { continue } @@ -586,3 +641,5 @@ func main() { + + diff --git a/ass3/zbirnik/parsing/test.go b/ass3/zbirnik/parsing/test.go index 5b8ac0f..ebeab4b 100644 --- a/ass3/zbirnik/parsing/test.go +++ b/ass3/zbirnik/parsing/test.go @@ -2,13 +2,12 @@ package main import ( "fmt" + "strconv" ) func main() { - ut := make(map[string]int) - ut["nov"] = 300 - val, ok := ut["nov"] - fmt.Println(val, ok) - val2, ok2 := ut["nova"] - fmt.Println(val2, ok2) + test := "30" + var i int + i, _ = strconv.Atoi(test) + fmt.Println(i) }