summaryrefslogtreecommitdiff
path: root/t/parse.lisp
blob: 9562e1d21063c4626e0652ba7ab4700cbd6d9867 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
(in-package #:rva-tests)

(def-suite parse-tests
  :description "Test functions exported from the parser."
  :in all-tests)

;;; these tests are not exhaustive, and are meant to test basic functionality
;;; under correct circumstances.

(in-suite parse-tests)

(test esrap-register-bases
      (is (equal '(parse::p
                   (parse::x
                    (parse::r "ADD" (parse::rr 10) (parse::rr 10) (parse::rr 10))))
                 (esrap:parse 'parse::str->ast (format nil ".TEXT~%~tADD $0O012 $0B1010 $0XA~%")))))

(test esrap-instr-all-type-r
      (is (equal
           '(parse::p
             (parse::x
              (parse::r "ADDV" (parse::rr 1) (parse::rr 2) (parse::rr 3))
              (parse::r "NOT" (parse::rr 4) (parse::rr 0) (parse::rr 5))
              (parse::r "CMP" (parse::rr 6) (parse::rr 7) (parse::rr 0))))
           (esrap:parse 'parse::str->ast (format nil ".TEXT~%~tADDV $3 $1 $2
~tNOT $5 $4~%~tCMP $6 $7~%")))))

(test esrap-instr-all-type-i
      (is (equal
           '(parse::p
             (parse::x
              (parse::i "LOADV" (parse::rr 8) (parse::rr 9) (parse::imm 1))
              (parse::i "STORE" (parse::rr 3) (parse::rr 5) (parse::imm 3))
              (parse::i "ADDI" (parse::rr 5) (parse::rr 4) (parse::imm 2))))
           (esrap:parse 'parse::str->ast (format nil ".TEXT~%~tLOADV $8 1($9)
~tSTORE $5 3($3)~%~tADDI $5 $4 2~%")))))

(test esrap-instr-type-all-type-j
      (is (equal
           '(parse::p
             (parse::x
              (parse::j "JMP" (parse::rr 3) (parse::imm 3))
              (parse::j "JRL" (parse::rr 0) (parse::l "FOO"))
              (parse::j "PUSH" (parse::rr 5) (parse::imm 0))))
           (esrap:parse 'parse::str->ast (format nil ".TEXT~%~tJMP 3($3)
~tJRL FOO~%~tPUSH $5~%")))))

(test esrap-instr-type-i-vars
      (is (equal
           '(parse::p
             (parse::x
              (parse::i "LOADV" (parse::rr 8) (parse::rr 0) (parse::var "vector"))
              (parse::i "STORE" (parse::rr 0) (parse::rr 5) (parse::var "int"))))
           (esrap:parse 'parse::str->ast (format nil ".TEXT~%~tLOADV $8 vector
~tSTORE $5 int~%")))))

(test esrap-instr-type-all-lazy-spaces
      (is (equal
           '(parse::p
             (parse::x
              (parse::j "JMP" (parse::rr 3) (parse::imm 3))
              (parse::j "JRL" (parse::rr 0) (parse::l "FOO"))
              (parse::j "PUSH" (parse::rr 5) (parse::imm 0))))
           (esrap:parse 'parse::str->ast (format nil "~t~%.TEXT~t~%JMP 3($3)~t
JRL FOO~t~%PUSH $5~%")))))

(test esrap-data-singleton
      (is (equal
           '(parse::p
             (parse::d
              1))
           (esrap:parse 'parse:str->ast (format nil ".DATA~%~tA 1~%")))))

(test esrap-data-loaded
      (is (equal
           '(parse::p
             (parse::d
              1 2 3 4 5 6 7 8))
           (esrap:parse 'parse:str->ast (format nil ".DATA~%~tB 1 2 3 4 5 6 7 8~%")))))

(test esrap-data-triple
      (is (equal
           '(parse::p
             (parse::d
              5 6 7 8 4 3 5))
           (esrap:parse 'parse:str->ast (format nil ".DATA~%~tC 5 6 7 8~%~tD 4
~tE 3 5~%")))))

(test esrap-data-lazy-spaces
      (is (equal
           '(parse::p
             (parse::d
              5 6 7 8 4 3 5))
           (esrap:parse 'parse:str->ast (format nil "~%~t.DATA~t~%F 5 6 7 8~t~%G 4
H 3 5~%")))))

(test esrap-data-full
      (is (equal
           '(parse::p
             (parse::d
              1 2 3 4 3 0)
             (parse::x
              (parse::i "LOAD" (parse::rr 5) (parse::rr 0) (parse::var "S"))
              (parse::i "LOAD" (parse::rr 10) (parse::rr 0) (parse::var "ARR"))
              (parse::i "LOAD" (parse::rr 6) (parse::rr 0) (parse::var "I"))
              (parse::j "JRL" (parse::rr 0) (parse::l "CMP"))
              (parse::r "ADD" (parse::rr 10) (parse::rr 6) (parse::rr 9))
              (parse::i "ADDI" (parse::rr 6) (parse::rr 6) (parse::imm 1))
              (parse::r "CMP" (parse::rr 6) (parse::rr 5) (parse::rr 0))
              (parse::j "BGT" (parse::rr 0) (parse::l "L"))))
           (esrap:parse 'parse:str->ast (format nil "
.DATA
        ARR 1 2 3 4
        S   3
        I   0

.TEXT
        LOAD $5 S
        LOAD $10 ARR
        LOAD $6 I
        JRL CMP
L:
        ADD $9 $10 $6
        ADDI $6 $6 0X1
CMP:
        CMP $6 $5
        BGT L~%")))))