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 SHIFTR A, 10, X
LDS #11 .komentar2 LDS #11 .komentar2
LDT #5 LDT #5
NOBASE .koment
NOBASE
BASE ZERO .KOMENTAR
ORG tab-tab
LAB NOBASE
EQU
LAB NOBASE .koment
.komentar3 .komentar3
LDA ZERO LDA ZERO
ADDR S, A ADDR S, A
@ -43,10 +36,12 @@ HALT J HALT
END arithr END arithr
ZERO WORD 0 ZERO WORD 0
one BYTE 123 .KOMETA R
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 .komentar6
mod RESW 1 mod RESW 1
WORD 400 . WER
.komentar7 .komentar7

View file

@ -5,6 +5,7 @@ import (
"os" "os"
"regexp" "regexp"
"strings" "strings"
"strconv"
) )
var ukazna_tabela = map[string]int{ var ukazna_tabela = map[string]int{
@ -177,6 +178,7 @@ type format_M_r struct {
format int // 8 format int // 8
velikost int velikost int
operand string operand string
rezervacija int
} }
type format_M_i struct { type format_M_i struct {
@ -185,6 +187,7 @@ type format_M_i struct {
format int // 9 format int // 9
velikost int velikost int
operand string operand string
rezervacija int
} }
func remove_comments_and_empty_lines(el string) bool { 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.") fmt.Println("Error while matching string.")
} }
if match_M_r { if match_M_r {
var nova_direktiva format_D_n var nova_direktiva format_M_r
re_ime := regexp.MustCompile(`RESW|RESB`) re_ime := regexp.MustCompile(`RESW|RESB`)
nova_direktiva.ime = re_ime.FindString(el) nova_direktiva.ime = re_ime.FindString(el)
nova_direktiva.format = 8 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 true
} }
return false return false
@ -560,6 +612,9 @@ func main() {
if check_M_r(el, &AST) { if check_M_r(el, &AST) {
continue continue
} }
if check_M_i(el, &AST) {
continue
}
if check_F1(el, &AST) { if check_F1(el, &AST) {
continue continue
} }
@ -586,3 +641,5 @@ func main() {

View file

@ -2,13 +2,12 @@ package main
import ( import (
"fmt" "fmt"
"strconv"
) )
func main() { func main() {
ut := make(map[string]int) test := "30"
ut["nov"] = 300 var i int
val, ok := ut["nov"] i, _ = strconv.Atoi(test)
fmt.Println(val, ok) fmt.Println(i)
val2, ok2 := ut["nova"]
fmt.Println(val2, ok2)
} }