summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-04-10 21:56:36 -0400
committerbd <bdunahu@operationnull.com>2025-04-10 21:56:36 -0400
commit42ae34d6f2ee0f0eb10e6ecc1e914c5d4753a184 (patch)
tree5c97c17528ee08641588800915805ff4aa80b332
parent0f0dd1012d6b1768eb91f1b35e8a7006d09414ab (diff)
Allow all integers to be negative
-rw-r--r--src/parse.lisp12
-rw-r--r--t/parse.lisp13
2 files changed, 19 insertions, 6 deletions
diff --git a/src/parse.lisp b/src/parse.lisp
index 6b0d31d..687474b 100644
--- a/src/parse.lisp
+++ b/src/parse.lisp
@@ -18,6 +18,8 @@
(incf line-number)
nil))
+(esrap:defrule sign (or #\+ #\-))
+
(esrap:defrule alpha (+ (alphanumericp character))
(:text t))
@@ -38,7 +40,9 @@
"A" "B" "C" "D" "E" "F")))
(:lambda (e) (parse-integer (esrap:text (cddr e)) :radix 16)))
-(esrap:defrule int (or binary octal hex decimal))
+(esrap:defrule int (and (esrap:? sign) (or binary octal hex decimal))
+ (:destructure (s i)
+ (if (and s (string= s "-")) (- i) i)))
;;; defines rules to parse an operand
@@ -49,10 +53,10 @@
(esrap:defrule var alpha
(:lambda (e) (list (list 'emit::rr 0) (list 'emit::var e))))
-(esrap:defrule dereference (and (esrap:? (or #\+ #\-)) int #\( register #\))
- (:destructure (s i1 w1 r w2)
+(esrap:defrule dereference (and int #\( register #\))
+ (:destructure (i1 w1 r w2)
(declare (ignore w1 w2))
- (list r (list 'emit::imm (if (and s (string= s "-")) (- i1) i1)))))
+ (list r (list 'emit::imm i1))))
(esrap:defrule immediate int
(:lambda (e) (list 'emit::imm e)))
diff --git a/t/parse.lisp b/t/parse.lisp
index 8f636e5..f82c98c 100644
--- a/t/parse.lisp
+++ b/t/parse.lisp
@@ -113,6 +113,15 @@ JRL FOO~t~%PUSH $5~%")))))
(esrap:parse 'parse:str->ast (format nil "~%~t.DATA~t~%F 5 6 7 8~t~%G 4
H 3 5~%.TEXT~%")))))
+(test esrap-negative-ints
+ (is (equal
+ '(emit::p
+ (emit::d
+ -1)
+ (emit::x
+ (emit::i "LOADV" (emit::rr -8) (emit::rr -3) (emit::imm -3))))
+ (esrap:parse 'parse:str->ast (format nil ".DATA~%~tm -1~%.TEXT~%~tLOADV $-8 -3($-3)~%")))))
+
(test esrap-data-full
(is (equal
'(emit::p
@@ -122,11 +131,11 @@ H 3 5~%.TEXT~%")))))
(emit::i "LOAD" (emit::rr 5) (emit::rr 0) (emit::var "S"))
(emit::i "LOAD" (emit::rr 10) (emit::rr 0) (emit::var "ARR"))
(emit::i "LOAD" (emit::rr 6) (emit::rr 0) (emit::var "I"))
- (emit::j "JRL" (emit::rr 0) (emit::l "CMP" 19))
+ (emit::j "JRL" (emit::rr 0) (emit::l "CMP" 20))
(emit::r "ADD" (emit::rr 10) (emit::rr 6) (emit::rr 9))
(emit::i "ADDI" (emit::rr 6) (emit::rr 6) (emit::imm 1))
(emit::r "CMP" (emit::rr 6) (emit::rr 5) (emit::rr 0))
- (emit::j "BGT" (emit::rr 0) (emit::l "L" 23))))
+ (emit::j "BGT" (emit::rr 0) (emit::l "L" 24))))
(esrap:parse 'parse:str->ast (format nil "
.DATA
ARR 1 2 3 4