diff --git a/ass3/zbirnik/parsing/input_invalid.asm b/ass3/zbirnik/parsing/input_invalid.asm new file mode 100644 index 0000000..0b46a01 --- /dev/null +++ b/ass3/zbirnik/parsing/input_invalid.asm @@ -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 diff --git a/ass3/zbirnik/parsing/pregledovalnik.go b/ass3/zbirnik/parsing/pregledovalnik.go index 384936e..81b4253 100644 --- a/ass3/zbirnik/parsing/pregledovalnik.go +++ b/ass3/zbirnik/parsing/pregledovalnik.go @@ -4,21 +4,89 @@ import ( "fmt" "os" "regexp" + "strings" ) -/* + type ukaz struct { opcode 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{ - "LDA": -}*/ +var ukazna_tabela = map[string]int{ + "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) +// // ::== [] { } [] + + 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 { fmt.Println("Error reading input file: ", err) return @@ -26,7 +94,7 @@ func main() { input := string(inputbyte) pattern := regexp.MustCompile(`.*\n`) matches := pattern.FindAllString(input, -1) - //var cleared_matches []string + //var AST []ukaz for _, el := range matches { match_pure_comment, err := regexp.MatchString(`(?m)^[\t ]*\..*$\n`, el) if err != nil { @@ -42,14 +110,19 @@ func main() { if match_empty { continue } - match_command, err := regexp.MatchString(``, el) - fmt.Print(el) + match_F1, err := regexp.MatchString(`(?m)^[A-Za-z_]*[\t ]+[A-Za-z]+[\t ]*(\..*)?$\n`, 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 - //... - // ::== [] { } [] } diff --git a/ass3/zbirnik/parsing/test.go b/ass3/zbirnik/parsing/test.go index 7d7ed38..1e5750b 100644 --- a/ass3/zbirnik/parsing/test.go +++ b/ass3/zbirnik/parsing/test.go @@ -2,16 +2,9 @@ package main import ( "fmt" - "regexp" ) func main() { - pattern := regexp.MustCompile(`o\w*g`) - fmt.Println(pattern.FindString("oogenesis")) // returns "" - 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) + i := 0xB4 + fmt.Println(i) }