source
prog
defn
TYP
1:1-1:3
typ
ID
1:5-1:5
i
EQUALS
1:7-1:7
=
type
INT
1:9-1:11
int
defn
TYP
2:1-2:3
typ
ID
2:5-2:5
c
EQUALS
2:7-2:7
=
type
CHAR
2:9-2:12
char
defn
TYP
3:1-3:3
typ
ID
3:5-3:5
b
EQUALS
3:7-3:7
=
type
BOOL
3:9-3:12
bool
defn
VAR
5:1-5:3
var
ID
5:5-5:6
g1
COLON
5:8-5:8
:
type
ID
5:10-5:10
i
defn
VAR
6:1-6:3
var
ID
6:5-6:6
g2
COLON
6:8-6:8
:
type
ID
6:10-6:10
i
defn
FUN
8:1-8:3
fun
ID
8:5-8:7
ext
LBRACKET
8:8-8:8
(
ID
8:9-8:9
a
COLON
8:11-8:11
:
type
ID
8:13-8:13
i
COMMA
8:14-8:14
,
ID
8:16-8:17
bb
COLON
8:19-8:19
:
type
ID
8:21-8:21
i
RBRACKET
8:22-8:22
)
COLON
8:24-8:24
:
type
ID
8:26-8:26
i
defn
FUN
10:1-10:3
fun
ID
10:5-10:10
helper
LBRACKET
10:11-10:11
(
ID
10:12-10:12
x
COLON
10:14-10:14
:
type
ID
10:16-10:16
i
RBRACKET
10:17-10:17
)
COLON
10:19-10:19
:
type
ID
10:21-10:21
b
EQUALS
10:23-10:23
=
expr
expr
ID
11:5-11:5
x
EEQUALS
11:7-11:8
==
expr
NUM
11:10-11:10
0
defn
FUN
13:1-13:3
fun
ID
13:5-13:7
fib
LBRACKET
13:8-13:8
(
ID
13:9-13:9
n
COLON
13:11-13:11
:
type
ID
13:13-13:13
i
RBRACKET
13:14-13:14
)
COLON
13:16-13:16
:
type
ID
13:18-13:18
i
EQUALS
13:20-13:20
=
expr
IF
14:5-14:6
if
expr
expr
ID
14:8-14:8
n
EEQUALS
14:10-14:11
==
expr
NUM
14:13-14:13
0
THEN
14:15-14:18
then
expr
NUM
15:9-15:9
0
ELSE
16:5-16:8
else
expr
IF
17:9-17:10
if
expr
expr
ID
17:12-17:12
n
EEQUALS
17:14-17:15
==
expr
NUM
17:17-17:17
1
THEN
17:19-17:22
then
expr
NUM
18:13-18:13
1
ELSE
19:9-19:12
else
expr
expr
expr
ID
20:13-20:15
fib
LBRACKET
20:16-20:16
(
expr
expr
ID
20:17-20:17
n
MINUS
20:19-20:19
-
expr
NUM
20:21-20:21
1
RBRACKET
20:22-20:22
)
PLUS
20:24-20:24
+
expr
expr
ID
20:26-20:28
fib
LBRACKET
20:29-20:29
(
expr
expr
ID
20:30-20:30
n
MINUS
20:32-20:32
-
expr
NUM
20:34-20:34
2
RBRACKET
20:35-20:35
)
END
21:9-21:11
end
END
22:5-22:7
end
defn
FUN
24:1-24:3
fun
ID
24:5-24:8
main
LBRACKET
24:9-24:9
(
RBRACKET
24:10-24:10
)
COLON
24:12-24:12
:
type
ID
24:14-24:14
i
EQUALS
24:16-24:16
=
expr
LET
25:5-25:7
let
defn
VAR
26:9-26:11
var
ID
26:13-26:18
local1
COLON
26:20-26:20
:
type
ID
26:22-26:22
i
defn
VAR
27:9-27:11
var
ID
27:13-27:18
local2
COLON
27:20-27:20
:
type
ID
27:22-27:22
i
defn
TYP
28:9-28:11
typ
ID
28:13-28:14
li
EQUALS
28:16-28:16
=
type
ID
28:18-28:18
i
defn
FUN
29:9-29:11
fun
ID
29:13-29:17
inner
LBRACKET
29:18-29:18
(
ID
29:19-29:19
a
COLON
29:21-29:21
:
type
ID
29:23-29:24
li
COMMA
29:25-29:25
,
ID
29:27-29:28
bb
COLON
29:30-29:30
:
type
ID
29:32-29:33
li
RBRACKET
29:34-29:34
)
COLON
29:36-29:36
:
type
ID
29:38-29:39
li
EQUALS
29:41-29:41
=
expr
LET
30:13-30:15
let
defn
VAR
31:17-31:19
var
ID
31:21-31:23
tmp
COLON
31:25-31:25
:
type
ID
31:27-31:28
li
IN
32:13-32:14
in
expr
expr
ID
33:17-33:19
tmp
EQUALS
33:21-33:21
=
expr
expr
ID
33:23-33:23
a
PLUS
33:25-33:25
+
expr
ID
33:27-33:28
bb
COMMA
33:29-33:29
,
expr
expr
ID
34:17-34:19
tmp
ASTERISK
34:21-34:21
*
expr
NUM
34:23-34:23
2
END
35:13-35:15
end
IN
36:5-36:6
in
expr
expr
ID
37:9-37:10
g1
EQUALS
37:12-37:12
=
expr
NUM
37:14-37:15
10
COMMA
37:16-37:16
,
expr
expr
ID
38:9-38:10
g2
EQUALS
38:12-38:12
=
expr
NUM
38:14-38:15
20
COMMA
38:16-38:16
,
expr
expr
ID
39:9-39:14
local1
EQUALS
39:16-39:16
=
expr
expr
ID
39:18-39:20
fib
LBRACKET
39:21-39:21
(
expr
ID
39:22-39:23
g1
RBRACKET
39:24-39:24
)
COMMA
39:25-39:25
,
expr
expr
ID
40:9-40:14
local2
EQUALS
40:16-40:16
=
expr
expr
ID
40:18-40:22
inner
LBRACKET
40:23-40:23
(
expr
ID
40:24-40:25
g1
COMMA
40:26-40:26
,
expr
ID
40:28-40:29
g2
RBRACKET
40:30-40:30
)
COMMA
40:31-40:31
,
expr
LET
41:9-41:11
let
defn
VAR
42:13-42:15
var
ID
42:17-42:22
shadow
COLON
42:24-42:24
:
type
ID
42:26-42:26
b
defn
VAR
43:13-43:15
var
ID
43:17-43:18
g1
COLON
43:20-43:20
:
type
ID
43:22-43:22
b
IN
44:9-44:10
in
expr
expr
ID
45:13-45:18
shadow
EQUALS
45:20-45:20
=
expr
expr
ID
45:22-45:27
helper
LBRACKET
45:28-45:28
(
expr
ID
45:29-45:34
local1
RBRACKET
45:35-45:35
)
COMMA
45:36-45:36
,
expr
expr
ID
46:13-46:14
g1
EQUALS
46:16-46:16
=
expr
expr
expr
ID
46:18-46:23
shadow
AND
46:25-46:27
and
expr
TRUE
46:29-46:32
true
OR
46:34-46:35
or
expr
FALSE
46:37-46:41
false
COMMA
46:42-46:42
,
expr
LET
47:13-47:15
let
defn
VAR
48:17-48:19
var
ID
48:21-48:24
deep
COLON
48:26-48:26
:
type
ID
48:28-48:28
i
IN
49:13-49:14
in
expr
expr
ID
50:17-50:20
deep
EQUALS
50:22-50:22
=
expr
expr
ID
50:24-50:26
ext
LBRACKET
50:27-50:27
(
expr
ID
50:28-50:33
local1
COMMA
50:34-50:34
,
expr
ID
50:36-50:41
local2
RBRACKET
50:42-50:42
)
COMMA
50:43-50:43
,
expr
IF
51:17-51:18
if
expr
expr
ID
51:20-51:25
helper
LBRACKET
51:26-51:26
(
expr
ID
51:27-51:30
deep
RBRACKET
51:31-51:31
)
THEN
51:33-51:36
then
expr
expr
ID
52:21-52:22
g2
EQUALS
52:24-52:24
=
expr
expr
ID
52:26-52:29
deep
PLUS
52:31-52:31
+
expr
NUM
52:33-52:33
1
ELSE
53:17-53:20
else
expr
expr
ID
54:21-54:22
g2
EQUALS
54:24-54:24
=
expr
expr
ID
54:26-54:29
deep
MINUS
54:31-54:31
-
expr
NUM
54:33-54:33
1
END
55:17-55:19
end
COMMA
55:20-55:20
,
expr
WHILE
56:17-56:21
while
expr
expr
ID
56:23-56:24
g2
GT
56:26-56:26
>
expr
NUM
56:28-56:28
0
DO
56:30-56:31
do
expr
IF
57:21-57:22
if
expr
expr
expr
ID
57:24-57:25
g2
PERCENT
57:27-57:27
%
expr
NUM
57:29-57:29
2
EEQUALS
57:31-57:32
==
expr
NUM
57:34-57:34
0
THEN
57:36-57:39
then
expr
expr
ID
58:25-58:26
g2
EQUALS
58:28-58:28
=
expr
expr
ID
58:30-58:31
g2
MINUS
58:33-58:33
-
expr
NUM
58:35-58:35
1
ELSE
59:21-59:24
else
expr
expr
ID
60:25-60:26
g2
EQUALS
60:28-60:28
=
expr
expr
expr
ID
60:30-60:31
g2
ASTERISK
60:33-60:33
*
expr
NUM
60:35-60:35
2
MINUS
60:37-60:37
-
expr
NUM
60:39-60:39
3
END
61:21-61:23
end
END
62:17-62:19
end
COMMA
62:20-62:20
,
expr
ID
63:17-63:20
deep
END
64:13-64:15
end
END
65:9-65:11
end
END
66:5-66:7
end
EOF