1 module List = ListLabels
6 /* an array type and an array variable */ \
8 type arrtype = array of int \
17 let open Tiger.Parser.Token in
19 TYPE; ID "arrtype"; EQ; ARRAY; OF; ID "int";
20 VAR; ID "arr1"; COLON; ID "arrtype"; ASSIGN;
21 ID "arrtype"; LBRACK; INT 10; RBRACK; OF; INT 0;
27 ("test_01", code, tokens)
32 /* arr1 is valid since expression 0 is int = myint */ \
35 type arrtype = array of myint \
44 let open Tiger.Parser.Token in
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;
55 ("test_02", code, tokens)
60 /* a record type and a record variable */ \
66 var rec1 : rectype := \
72 rec1.name := \"Somebody\"; \
78 let open Tiger.Parser.Token in
80 TYPE; ID "rectype"; EQ;
81 LBRACE; ID "name"; COLON; ID "string";
82 COMMA; ID "age"; COLON; ID "int";
84 VAR; ID "rec1"; COLON; ID "rectype"; ASSIGN;
86 LBRACE; ID "name"; EQ; STRING "Nobody";
87 COMMA; ID "age"; EQ; INT 1000;
90 ID "rec1"; DOT; ID "name"; ASSIGN; STRING "Somebody"; SEMICOLON;
95 ("test_03", code, tokens)
98 let name = "define a recursive function" in
105 function nfactor(n: int): int = \
108 else n * nfactor(n-1) \
116 let open Tiger.Parser.Token in
118 FUNCTION; ID "nfactor"; LPAREN; ID "n"; COLON; ID "int"; RPAREN; COLON; ID "int"; EQ;
119 IF; ID "n"; EQ; INT 0;
121 ELSE; ID "n"; TIMES; ID "nfactor"; LPAREN; ID "n"; MINUS; INT 1; RPAREN;
123 ID "nfactor"; LPAREN; INT 10; RPAREN;
129 let tokens_of_code code =
130 let lexbuf = Lexing.from_string code in
132 match Tiger.Lexer.token lexbuf with
134 | Some token -> token :: tokens ()
146 let bar_sep = String.make 80 '-' in
147 let bar_end = String.make 80 '=' in
148 List.iter tests ~f:(fun (name, code, tokens_expected) ->
150 printf "%s\n==> Test %S: " bar_sep name;
151 let tokens_emitted = tokens_of_code code in
153 assert (tokens_emitted = tokens_expected);
155 with Assert_failure _ ->
156 let tokens_to_string tokens =
157 String.concat "; " (List.map ~f:Tiger.Parser.Token.to_string tokens)
160 "ERROR\n Expected: %s\n Emitted : %s\n\n"
161 (tokens_to_string tokens_expected)
162 (tokens_to_string tokens_emitted)
165 print_endline bar_end;