From 532f8276fb76f9dd0bbdfefc2bf970fb42858a7d Mon Sep 17 00:00:00 2001 From: Jacob McDonnell Date: Fri, 10 May 2024 14:37:32 -0400 Subject: More Robust REGEX parsing --- qdma | Bin 0 -> 2427020 bytes qdma.go | 45 ++++++++++++++++++++++++++++++++++++++------- test.asm | 10 ---------- test.bin | Bin 32 -> 0 bytes test2.asm | 21 --------------------- tests/test.asm | 10 ++++++++++ tests/test.bin | Bin 0 -> 32 bytes tests/test2.asm | 21 +++++++++++++++++++++ tests/test3.asm | 6 ++++++ tests/test3.bin | 0 10 files changed, 75 insertions(+), 38 deletions(-) create mode 100755 qdma delete mode 100755 test.asm delete mode 100755 test.bin delete mode 100755 test2.asm create mode 100755 tests/test.asm create mode 100755 tests/test.bin create mode 100755 tests/test2.asm create mode 100644 tests/test3.asm create mode 100644 tests/test3.bin diff --git a/qdma b/qdma new file mode 100755 index 0000000..29ddd33 Binary files /dev/null and b/qdma differ diff --git a/qdma.go b/qdma.go index 37e83a1..a968397 100755 --- a/qdma.go +++ b/qdma.go @@ -3,8 +3,8 @@ package main import ( "bufio" "encoding/binary" - "log" "os" + "regexp" "strconv" "strings" ) @@ -85,7 +85,10 @@ func Encode(instruction string) uint32 { if instruction == "syscall" { return 12 } - inst := strings.Fields(strings.ReplaceAll(instruction, ",", "")) + inst, err := parse(instruction) + if err != nil { + panic(err) + } if Instructions[inst[0]].isRtype { ret = (RegNums[inst[2]] << 21) | (RegNums[inst[3]] << 16) | (RegNums[inst[1]] << 11) | Instructions[inst[0]].opcode @@ -93,7 +96,7 @@ func Encode(instruction string) uint32 { var imm int32 i, err := strconv.Atoi(inst[3]) if err != nil { - log.Fatal(err) + panic(err) } imm = int32(i) ret = (Instructions[inst[0]].opcode << 26) | (RegNums[inst[2]] << 21) | @@ -105,13 +108,13 @@ func Encode(instruction string) uint32 { func Assemble(path string) { file, err := os.Open(path) if err != nil { - log.Fatal(err) + panic(err) } defer file.Close() out, err := os.Create(strings.ReplaceAll(path, ".asm", ".bin")) if err != nil { - log.Fatal(err) + panic(err) } defer out.Close() @@ -123,14 +126,42 @@ func Assemble(path string) { binary.BigEndian.PutUint32(bs, Encode(s)) _, err := out.Write(bs) if err != nil { - log.Fatal(err) + panic(err) } } } if err := scanner.Err(); err != nil { - log.Fatal(err) + panic(err) + } +} + +func parse(s string) ([]string, error) { + /* regex to match 00($t0) + offset, err := regexp.Compile("[0-9]+\\((.*)+\\)") + if err != nil { + panic(err) + }*/ + + edgeWs, err := regexp.Compile("(^\\s+|\\s+$)+") + if err != nil { + return nil, err } + + whiteSpace, err := regexp.Compile("\\s+") + if err != nil { + return nil, err + } + + repeatComma, err := regexp.Compile(",{2,}") + if err != nil { + return nil, err + } + + s = edgeWs.ReplaceAllString(s, "") + s = whiteSpace.ReplaceAllString(s, ",") + s = repeatComma.ReplaceAllString(s, ",") + return strings.Split(s, ","), nil } func main() { diff --git a/test.asm b/test.asm deleted file mode 100755 index fbb450b..0000000 --- a/test.asm +++ /dev/null @@ -1,10 +0,0 @@ -addi $t0, $zero, 10 -addi $t1, $zero, 12 -add $t2, $t1, $t0 - -add $a0, $t2, $zero -addi $v0, $zero, 1 -syscall - -addi $v0, $zero, 10 -syscall diff --git a/test.bin b/test.bin deleted file mode 100755 index 2cf7b8d..0000000 Binary files a/test.bin and /dev/null differ diff --git a/test2.asm b/test2.asm deleted file mode 100755 index e22cd5e..0000000 --- a/test2.asm +++ /dev/null @@ -1,21 +0,0 @@ -.data - -fib: space 40 - -str: .asciiz "Hello" - -.text -main: addi $t0, $zero, 10 - addi $t1, $zero, 11 - loop: add $t2, $t1, $t0 - - addi $v0, $zero, 1 - addi $a0, $t2, 0 - syscall - - addi $t0, $t0, -1 - addi $t1, $t1, -1 - bne $t0, $zero, loop - addi $v0, $zero, 10 - syscall - diff --git a/tests/test.asm b/tests/test.asm new file mode 100755 index 0000000..fbb450b --- /dev/null +++ b/tests/test.asm @@ -0,0 +1,10 @@ +addi $t0, $zero, 10 +addi $t1, $zero, 12 +add $t2, $t1, $t0 + +add $a0, $t2, $zero +addi $v0, $zero, 1 +syscall + +addi $v0, $zero, 10 +syscall diff --git a/tests/test.bin b/tests/test.bin new file mode 100755 index 0000000..2cf7b8d Binary files /dev/null and b/tests/test.bin differ diff --git a/tests/test2.asm b/tests/test2.asm new file mode 100755 index 0000000..e22cd5e --- /dev/null +++ b/tests/test2.asm @@ -0,0 +1,21 @@ +.data + +fib: space 40 + +str: .asciiz "Hello" + +.text +main: addi $t0, $zero, 10 + addi $t1, $zero, 11 + loop: add $t2, $t1, $t0 + + addi $v0, $zero, 1 + addi $a0, $t2, 0 + syscall + + addi $t0, $t0, -1 + addi $t1, $t1, -1 + bne $t0, $zero, loop + addi $v0, $zero, 10 + syscall + diff --git a/tests/test3.asm b/tests/test3.asm new file mode 100644 index 0000000..cf5b1a8 --- /dev/null +++ b/tests/test3.asm @@ -0,0 +1,6 @@ +addiu $sp,$sp,-40 +sw $31,36($sp) +sw $fp,32($sp) +sw $16,28($sp) +move $fp,$sp +sw $4,40($fp) diff --git a/tests/test3.bin b/tests/test3.bin new file mode 100644 index 0000000..e69de29 -- cgit v1.2.3