Commit | Line | Data |
---|---|---|
5da420a8 | 1 | module Error = Tiger_error |
d3bdde4b | 2 | module Test = Tiger_test |
f752b2c7 | 3 | |
d3bdde4b | 4 | let book = |
f752b2c7 SK |
5 | [ Test.case |
6 | "Book test 1: an array type and an array variable" | |
7 | ~code: | |
8 | " \ | |
9 | /* an array type and an array variable */ \ | |
10 | let \ | |
11 | type arrtype = array of int \ | |
12 | var arr1:arrtype := \ | |
13 | arrtype [10] of 0 \ | |
14 | in \ | |
15 | arr1 \ | |
16 | end \ | |
17 | " | |
18 | ~out_lexing:( | |
d3bdde4b | 19 | let open Tiger_parser in |
f752b2c7 SK |
20 | [ LET; |
21 | TYPE; ID "arrtype"; EQ; ARRAY; OF; ID "int"; | |
22 | VAR; ID "arr1"; COLON; ID "arrtype"; ASSIGN; | |
23 | ID "arrtype"; LBRACK; INT 10; RBRACK; OF; INT 0; | |
24 | IN; | |
25 | ID "arr1"; | |
26 | END | |
27 | ] | |
28 | ) | |
29 | ; Test.case | |
30 | "Book test 2: arr1 is valid since expression 0 is int = myint" | |
31 | ~code: | |
32 | " \ | |
33 | /* arr1 is valid since expression 0 is int = myint */ \ | |
34 | let \ | |
35 | type myint = int \ | |
36 | type arrtype = array of myint \ | |
37 | var arr1:arrtype := \ | |
38 | arrtype [10] of 0 \ | |
39 | in \ | |
40 | arr1 \ | |
41 | end \ | |
42 | " | |
43 | ~out_lexing:( | |
d3bdde4b | 44 | let open Tiger_parser in |
f752b2c7 SK |
45 | [ LET; |
46 | TYPE; ID "myint"; EQ; ID "int"; | |
47 | TYPE; ID "arrtype"; EQ; ARRAY; OF; ID "myint"; | |
48 | VAR; ID "arr1"; COLON; ID "arrtype"; ASSIGN; | |
49 | ID "arrtype"; LBRACK; INT 10; RBRACK; OF; INT 0; | |
50 | IN; | |
51 | ID "arr1"; | |
52 | END | |
53 | ] | |
54 | ) | |
55 | ; Test.case | |
56 | "Book test 3: a record type and a record variable" | |
57 | ~code: | |
58 | " \ | |
59 | /* a record type and a record variable */ \ | |
60 | let \ | |
61 | type rectype = \ | |
62 | { name : string \ | |
63 | , age : int \ | |
64 | } \ | |
65 | var rec1 : rectype := \ | |
66 | rectype \ | |
67 | { name = \"Nobody\" \ | |
68 | , age = 1000 \ | |
69 | } \ | |
70 | in \ | |
71 | rec1.name := \"Somebody\"; \ | |
72 | rec1 \ | |
73 | end \ | |
74 | " | |
75 | ~out_lexing:( | |
d3bdde4b | 76 | let open Tiger_parser in |
f752b2c7 SK |
77 | [ LET; |
78 | TYPE; ID "rectype"; EQ; | |
79 | LBRACE; ID "name"; COLON; ID "string"; | |
80 | COMMA; ID "age"; COLON; ID "int"; | |
81 | RBRACE; | |
82 | VAR; ID "rec1"; COLON; ID "rectype"; ASSIGN; | |
83 | ID "rectype"; | |
84 | LBRACE; ID "name"; EQ; STRING "Nobody"; | |
85 | COMMA; ID "age"; EQ; INT 1000; | |
86 | RBRACE; | |
87 | IN; | |
88 | ID "rec1"; DOT; ID "name"; ASSIGN; STRING "Somebody"; SEMICOLON; | |
89 | ID "rec1"; | |
90 | END | |
91 | ] | |
92 | ) | |
93 | ; Test.case | |
94 | "Book test 4: define a recursive function" | |
95 | ~code: | |
96 | " \ | |
97 | /* define a recursive function */ \ | |
98 | let \ | |
99 | \ | |
100 | /* calculate n! */ \ | |
101 | function nfactor(n: int): int = \ | |
102 | if n = 0 \ | |
103 | then 1 \ | |
104 | else n * nfactor(n-1) \ | |
105 | \ | |
106 | in \ | |
107 | nfactor(10) \ | |
108 | end \ | |
109 | " | |
110 | ~out_lexing:( | |
d3bdde4b | 111 | let open Tiger_parser in |
f752b2c7 SK |
112 | [ LET; |
113 | FUNCTION; ID "nfactor"; LPAREN; ID "n"; COLON; ID "int"; RPAREN; COLON; ID "int"; EQ; | |
114 | IF; ID "n"; EQ; INT 0; | |
115 | THEN; INT 1; | |
116 | ELSE; ID "n"; TIMES; ID "nfactor"; LPAREN; ID "n"; MINUS; INT 1; RPAREN; | |
117 | IN; | |
118 | ID "nfactor"; LPAREN; INT 10; RPAREN; | |
119 | END | |
120 | ] | |
121 | ) | |
122 | ; Test.case | |
123 | "Book test 9: error : types of then - else differ" | |
124 | ~code: | |
125 | " \ | |
126 | /* error : types of then - else differ */ \ | |
127 | if (5>4) then 13 else \" \" \ | |
128 | " | |
129 | ~out_lexing:( | |
d3bdde4b | 130 | let open Tiger_parser in |
f752b2c7 SK |
131 | [ IF; LPAREN; INT 5; GT; INT 4; RPAREN; THEN; INT 13; ELSE; STRING " " |
132 | ] | |
133 | ) | |
9d441341 SK |
134 | ; Test.case |
135 | "Book test: 8-queens" | |
136 | ~code: | |
137 | "\ | |
138 | /* A program to solve the 8-queens problem */ \n\ | |
139 | \n\ | |
140 | let \n\ | |
141 | var N := 8 \n\ | |
142 | \n\ | |
143 | type intArray = array of int \n\ | |
144 | \n\ | |
145 | var row := intArray [ N ] of 0 \n\ | |
146 | var col := intArray [ N ] of 0 \n\ | |
147 | var diag1 := intArray [N+N-1] of 0 \n\ | |
148 | var diag2 := intArray [N+N-1] of 0 \n\ | |
149 | \n\ | |
150 | function printboard() = ( \n\ | |
151 | for i := 0 to N-1 do ( \n\ | |
152 | for j := 0 to N-1 do print(if col[i]=j then \" O\" else \" .\"); \n\ | |
153 | print(\"\n\") \n\ | |
154 | ); \n\ | |
155 | print(\"\n\") \n\ | |
82e73e6c | 156 | ) \n\ |
9d441341 SK |
157 | \n\ |
158 | function try(c:int) = ( \n\ | |
159 | /* for i:= 0 to c do print(\".\"); print(\"\n\"); flush();*/ \n\ | |
160 | if c=N \n\ | |
161 | then printboard() \n\ | |
162 | else \n\ | |
163 | for r := 0 to N-1 \n\ | |
164 | do \n\ | |
165 | if row[r]=0 & diag1[r+c]=0 & diag2[r+7-c]=0 \n\ | |
166 | then ( \n\ | |
167 | row[r] := 1; \n\ | |
168 | diag1[r+c] := 1; \n\ | |
169 | diag2[r+7-c] := 1; \n\ | |
170 | col[c] := r; \n\ | |
171 | try(c+1); \n\ | |
172 | row[r] := 0; \n\ | |
173 | diag1[r+c] := 0; \n\ | |
174 | diag2[r+7-c] := 0 \n\ | |
175 | ) \n\ | |
176 | ) \n\ | |
177 | in \n\ | |
178 | try(0) \n\ | |
179 | end \n\ | |
180 | " | |
181 | ] | |
82e73e6c | 182 | |
d3bdde4b SK |
183 | let micro = |
184 | let open Tiger_parser in | |
2c754e82 SK |
185 | [ (let code = "nil" in Test.case code ~code ~out_lexing:[NIL]) |
186 | ; (let code = "5" in Test.case code ~code ~out_lexing:[INT 5]) | |
187 | ; (let code = "-5" in Test.case code ~code ~out_lexing:[MINUS; INT 5]) | |
5da420a8 SK |
188 | ; ( let code = "f()" in |
189 | Test.case | |
190 | code | |
191 | ~code | |
192 | ~out_lexing:[ID "f"; LPAREN; RPAREN] | |
193 | ~is_error_expected_semant:Error.is_unknown_id | |
194 | ) | |
2c754e82 SK |
195 | ; (let code = "abc.i" in Test.case code ~code ~out_lexing:[ID "abc"; DOT; ID "i"]) |
196 | ; (let code = "abc[0]" in Test.case code ~code ~out_lexing:[ID "abc"; LBRACK; INT 0; RBRACK]) | |
78c9eca5 | 197 | |
2c754e82 | 198 | ; (let code = "abc[0] := foo()" in Test.case code ~code |
ead887f4 SK |
199 | ~out_lexing: |
200 | [ID "abc"; LBRACK; INT 0; RBRACK; ASSIGN; ID "foo"; LPAREN; RPAREN]) | |
68a223c2 | 201 | |
2c754e82 | 202 | ; (let code = "abc [5] of nil" in Test.case code ~code |
ead887f4 SK |
203 | ~out_lexing: |
204 | [ID "abc"; LBRACK; INT 5; RBRACK; OF; NIL]) | |
543d3420 | 205 | |
5da420a8 SK |
206 | ; ( let code = "f(\"a\", 3, foo)" in |
207 | Test.case | |
208 | code | |
209 | ~code | |
210 | ~out_lexing: | |
211 | [ID "f"; LPAREN; STRING "a"; COMMA; INT 3; COMMA; ID "foo"; RPAREN] | |
212 | ~is_error_expected_semant:Error.is_unknown_id | |
213 | ) | |
f752b2c7 | 214 | ] |
543d3420 | 215 | |
d3bdde4b SK |
216 | let all = |
217 | book @ micro |