1 module List = ListLabels
4 let name = "an array type and an array variable" in
9 type arrtype = array of int \
18 let open Tiger.Parser.Token in
20 TYPE; ID "arrtype"; EQ; ARRAY; OF; ID "int";
21 VAR; ID "arr1"; COLON; ID "arrtype"; ASSIGN;
22 ID "arrtype"; LBRACK; INT 10; RBRACK; OF; INT 0;
31 let name = "arr1 is valid since expression 0 is int = myint" in
37 type arrtype = array of myint \
46 let open Tiger.Parser.Token in
48 TYPE; ID "myint"; EQ; ID "int";
49 TYPE; ID "arrtype"; EQ; ARRAY; OF; ID "myint";
50 VAR; ID "arr1"; COLON; ID "arrtype"; ASSIGN;
51 ID "arrtype"; LBRACK; INT 10; RBRACK; OF; INT 0;
60 let name = "a record type and a record variable" in
69 var rec1 : rectype := \
75 rec1.name := \"Somebody\"; \
81 let open Tiger.Parser.Token in
83 TYPE; ID "rectype"; EQ;
84 LBRACE; ID "name"; COLON; ID "string";
85 COMMA; ID "age"; COLON; ID "int";
87 VAR; ID "rec1"; COLON; ID "rectype"; ASSIGN;
89 LBRACE; ID "name"; EQ; STRING "Nobody";
90 COMMA; ID "age"; EQ; INT 1000;
93 ID "rec1"; DOT; ID "name"; ASSIGN; STRING "Somebody"; SEMICOLON;
101 let name = "define a recursive function" in
108 function nfactor(n: int): int = \
111 else n * nfactor(n-1) \
119 let open Tiger.Parser.Token in
121 FUNCTION; ID "nfactor"; LPAREN; ID "n"; COLON; ID "int"; RPAREN; COLON; ID "int"; EQ;
122 IF; ID "n"; EQ; INT 0;
124 ELSE; ID "n"; TIMES; ID "nfactor"; LPAREN; ID "n"; MINUS; INT 1; RPAREN;
126 ID "nfactor"; LPAREN; INT 10; RPAREN;
132 let tokens_of_code code =
133 let lexbuf = Lexing.from_string code in
135 match Tiger.Lexer.token lexbuf with
137 | Some token -> token :: tokens ()
149 let bar_sep = String.make 80 '-' in
150 let bar_end = String.make 80 '=' in
151 List.iteri tests ~f:(fun i (name, code, tokens_expected) ->
152 let i = i + 1 in (* Because iteri starts with 0 *)
154 printf "%s\n Test %d : %S\n" bar_sep i name;
155 let tokens_emitted = tokens_of_code code in
157 assert (tokens_emitted = tokens_expected);
158 print_endline " ---> OK";
159 with Assert_failure _ ->
160 let tokens_to_string tokens =
161 String.concat "; " (List.map ~f:Tiger.Parser.Token.to_string tokens)
164 " ---> ERROR\n Expected: %s\n Emitted : %s\n\n"
165 (tokens_to_string tokens_expected)
166 (tokens_to_string tokens_emitted)
169 print_endline bar_end;