diff options
-rw-r--r-- | src/parse.lisp | 10 | ||||
-rw-r--r-- | t/parse.lisp | 22 |
2 files changed, 16 insertions, 16 deletions
diff --git a/src/parse.lisp b/src/parse.lisp index 687474b..73e98c5 100644 --- a/src/parse.lisp +++ b/src/parse.lisp @@ -50,15 +50,15 @@ (:function cadr) (:lambda (e) (list 'emit::rr e))) -(esrap:defrule var alpha - (:lambda (e) (list (list 'emit::rr 0) (list 'emit::var e)))) +(esrap:defrule variable alpha + (:lambda (e) (list 'emit::var e))) (esrap:defrule dereference (and int #\( register #\)) (:destructure (i1 w1 r w2) (declare (ignore w1 w2)) (list r (list 'emit::imm i1)))) -(esrap:defrule immediate int +(esrap:defrule immediate (or int variable) (:lambda (e) (list 'emit::imm e))) ;;; defines rules to parse labels @@ -114,12 +114,12 @@ DESTRUCTURE-PATTERN is the list of non-terminals on the right side of the gramma (defrule-instr i-type-3 'emit::i (1 0 2) register register immediate) (defrule-instr j-type-3 'emit::j (1 0) label) -(esrap:defrule i-type-1 (and i-type-1-m space register space (or dereference var)) +(esrap:defrule i-type-1 (and i-type-1-m space register space dereference) (:destructure (m w1 s w2 di) (declare (ignore w1 w2)) `(emit::i ,m ,s ,@di))) -(esrap:defrule i-type-2 (and i-type-2-m space register space (or dereference var)) +(esrap:defrule i-type-2 (and i-type-2-m space register space dereference) (:destructure (m w1 s w2 di) (declare (ignore w1 w2)) `(emit::i ,m ,@(util:insert-in-middle di s)))) diff --git a/t/parse.lisp b/t/parse.lisp index f82c98c..bd5ee97 100644 --- a/t/parse.lisp +++ b/t/parse.lisp @@ -62,10 +62,10 @@ '(emit::p (emit::d) (emit::x - (emit::i "LOADV" (emit::rr 8) (emit::rr 0) (emit::var "vector")) - (emit::i "STORE" (emit::rr 0) (emit::rr 5) (emit::var "int")))) - (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tLOADV $8 vector -~tSTORE $5 int~%"))))) + (emit::i "LOADV" (emit::rr 8) (emit::rr 4) (emit::imm 2)) + (emit::i "STORE" (emit::rr 1) (emit::rr 5) (emit::imm 2)))) + (esrap:parse 'parse:str->ast (format nil ".DATA~%.TEXT~%~tLOADV $8 2($4) +~tSTORE $5 2($1)~%"))))) (test esrap-instr-type-all-lazy-spaces (is (equal @@ -86,7 +86,7 @@ JRL FOO~t~%PUSH $5~%"))))) (emit::x)) (esrap:parse 'parse:str->ast (format nil ".DATA~%~tA 1~%.TEXT~%"))))) -(test esrap-data-loaded +(test esrap-data-loadedp (is (equal '(emit::p (emit::d @@ -128,9 +128,9 @@ H 3 5~%.TEXT~%"))))) (emit::d 1 2 3 4 3 0) (emit::x - (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::i "ADDI" (emit::rr 0) (emit::rr 5) (emit::imm (emit::var "S"))) + (emit::i "ADDI" (emit::rr 0) (emit::rr 10) (emit::imm (emit::var "ARR"))) + (emit::i "ADDI" (emit::rr 0) (emit::rr 6) (emit::imm (emit::var "I"))) (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)) @@ -143,9 +143,9 @@ H 3 5~%.TEXT~%"))))) I 0 .TEXT - LOAD $5 S - LOAD $10 ARR - LOAD $6 I + ADDI $5 $0 S + ADDI $10 $0 ARR + ADDI $6 $0 I JRL CMP L: ADD $9 $10 $6 |