This commit is contained in:
aljazbrodar. 2025-12-30 14:50:09 +01:00
parent ad4eba0796
commit 9bded21e50
3 changed files with 134 additions and 25 deletions

View file

@ -0,0 +1,43 @@
arithr START 0 .komentar1
LDS #11 .komentar2
LDT #5
.komentar3
LDA ZERO
ADDR S, A
ADDR T, A
STA sum
FIX
FLOAT
.komentar4
LDA ZERO
ADDR S, A
SUBR T, A
STA diff
HIO
LDA ZERO
ADDR S, A
MULR T, A
STA prod
LDA ZERO
ADDR S, A
DIVR T, A
STA quot
FIX . s komentarjem
LDA ZERO
ADDR S, A
LOOP SUBR T, A .komentar5
COMPR A, T
JGT LOOP
JEQ LOOP
STA mod
HALT J HALT
END arithr
ZERO WORD 0
sum RESW 1
diff RESW 1
prod RESW 1
quot RESW 1 .komentar6
mod RESW 1
.komentar7

View file

@ -4,21 +4,89 @@ import (
"fmt" "fmt"
"os" "os"
"regexp" "regexp"
"strings"
) )
/*
type ukaz struct { type ukaz struct {
opcode int opcode int
st_operandov int st_operandov int
format int format int // F1 - 1, F2 - 2, F3 - 3, F4 - 4, SIC - 5
velikost int //v bajtih
} }
var ukazna_tabela = map[string]ukaz{ var ukazna_tabela = map[string]int{
"LDA": "ADD": 0x18,
}*/ "ADDF": 0x58,
"ADDR": 0x90,
"AND": 0x40,
"CLEAR": 0xB4,
"COMP": 0x28,
"COMPF": 0x88,
"COMPR": 0xA0,
"DIV": 0x24,
"DIVF": 0x64,
"DIVR": 0x9C,
"FIX": 0xC4,
"FLOAT": 0xC0,
"HIO": 0xF4,
"J": 0x3C,
"JEQ": 0x30,
"JGT": 0x34,
"JLT": 0x38,
"JSUB": 0x48,
"LDA": 0x00,
"LDB": 0x68,
"LDCH": 0x50,
"LDF": 0x70,
"LDL": 0x08,
"LDS": 0x6C,
"LDT": 0x74,
"LDX": 0x04,
"LPS": 0xD0,
"MUL": 0x20,
"MULF": 0x60,
"MULR": 0x98,
"NORM": 0xC8,
"OR": 0x44,
"RD": 0xD4,
"RMO": 0xAC,
"RSUB": 0x4C,
"SHIFTL": 0xA4,
"SHIFTR": 0xA8,
"SIO": 0xF0,
"SSK": 0xEC,
"STA": 0x0C,
"STB": 0x78,
"STCH": 0x54,
"STF": 0x80,
"STI": 0xD4,
"STL": 0x14,
"STS": 0x74,
"STSW": 0xE8,
"STT": 0x84,
"STX": 0x10,
"SUB": 0x1C,
"SUBF": 0x5C,
"SUBR": 0x94,
"SVC": 0xB0,
"TD": 0xE0,
"TIO": 0xF8,
"TIX": 0x2C,
"TIXR": 0xB8,
"WD": 0xDC
}
// Pregledovalnik bere vhodne vrstice in jih razgradi na posamezne enote.
// Razpoznane elemente okvalificira (oznaka / mnemonik / operand / komentar)
// //<zbirniski stavek> ::== [<oznaka stavka>] <ločilo> <mnemonik> <ločilo> {<operand> <ločilo>} [<komentar>]
func main() { func main() {
inputbyte, err := os.ReadFile("input.asm") //register, _ := regexp.Compile("A|X|L|B|S|T|F")
inputbyte, err := os.ReadFile("input_invalid.asm")
if err != nil { if err != nil {
fmt.Println("Error reading input file: ", err) fmt.Println("Error reading input file: ", err)
return return
@ -26,7 +94,7 @@ func main() {
input := string(inputbyte) input := string(inputbyte)
pattern := regexp.MustCompile(`.*\n`) pattern := regexp.MustCompile(`.*\n`)
matches := pattern.FindAllString(input, -1) matches := pattern.FindAllString(input, -1)
//var cleared_matches []string //var AST []ukaz
for _, el := range matches { for _, el := range matches {
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 {
@ -42,14 +110,19 @@ func main() {
if match_empty { if match_empty {
continue continue
} }
match_command, err := regexp.MatchString(``, el) match_F1, err := regexp.MatchString(`(?m)^[A-Za-z_]*[\t ]+[A-Za-z]+[\t ]*(\..*)?$\n`, el)
fmt.Print(el) if err != nil {
fmt.Println("Error while matching string.")
}
if match_F1 {
var nov_ukaz ukaz
nov_ukaz.format = 1
nov_ukaz.st_operandov = 0
nov_ukaz.velikost = 1
pattern := regexp.MustCompile(`[\t ]+[A-Za-z]+`)
mnemonik := strings.Trim(re.FindString(el), " \n")
nov_ukaz.opcode = ukazna_tabela[mnemonik];
fmt.Print(mnemonik)
}
} }
//Zbirnik mora opraviti naslednje naloge:
//1) Pregledati in razčleniti zbirniški stavek (pregledovalnik)
//2) Mnemonike nadomestiti z operacijskimi kodami
//3) Simbolična imena nadomestiti z ustreznimi številskimi ekvivalenti
//4) Razrešiti simbolične operande
//...
//<zbirniski stavek> ::== [<oznaka stavka>] <ločilo> <mnemonik> <ločilo> {<operand> <ločilo>} [<komentar>]
} }

View file

@ -2,16 +2,9 @@ package main
import ( import (
"fmt" "fmt"
"regexp"
) )
func main() { func main() {
pattern := regexp.MustCompile(`o\w*g`) i := 0xB4
fmt.Println(pattern.FindString("oogenesis")) // returns "" fmt.Println(i)
fmt.Println(pattern.FindString("ck")) // returns "ook"
fmt.Println(pattern.FindString("oocyst")) // returns ""
fmt.Println(pattern.FindString("book")) // returns "ook"}
match, what := regexp.MatchString("p([a-z]+)ch", "peach")
fmt.Println(match)
fmt.Println(what)
} }