basic parsing done

This commit is contained in:
aljazbrodar. 2026-01-15 18:35:12 +01:00
parent 1055ccd52f
commit 47f6a2ae5d
3 changed files with 76 additions and 25 deletions

View file

@ -3,13 +3,6 @@ arithr START 0 .komentar1
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
@ -43,10 +36,12 @@ HALT J HALT
END arithr
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

View file

@ -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() {

View file

@ -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)
}