-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathastdump.a68
81 lines (76 loc) · 3.08 KB
/
astdump.a68
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
PR include "ast.a68" PR
OP DUMP = (INT i)VOID: print(whole(i,0));
OP DUMP = (STRING sym)VOID: print((sym,space));
OP DUMP = (SYMBOL sym)VOID: DUMP(repr OF sym);
OP DUMP = (CONST i)VOID: print((whole(int OF i,0),space));
OP DUMP = (IDENT id)VOID: (DUMP(name OF id); DUMP(info OF id));
OP DUMP = (REF DECLINFO info)VOID:
IF info ISNT NIL THEN
CASE decl OF info IN
(DECL d): (print("decl:"); DUMP (LOC DECL:=d)),
(PARAM p): (print("parm"); DUMP pos OF info; print(":"); DUMP type OF p)
ESAC
FI;
OP DUMP = (MONAD t)VOID:
(DUMP op OF t, DUMP lhs OF t);
OP DUMP = (DYAD t)VOID:
(DUMP op OF t, DUMP lhs OF t, DUMP rhs OF t);
OP DUMP = (FUNCALL t)VOID:
(DUMP id OF t, FOR i TO UPB args OF t DO DUMP (args OF t)[i] OD);
OP DUMP = (TUPLE t)VOID:
(DUMP lhs OF t, DUMP rhs OF t);
OP DUMP = (REF EXPR t)VOID:
(CASE t IN
(SYMBOL x): (print("(symbol "); DUMP x),
(CONST x): (print("(int "); DUMP x),
(MONAD x): (print("(monad "); DUMP x),
(DYAD x): (print("(dyad "); DUMP x),
(TUPLE x): (print("(tuple "); DUMP x),
(IDENT x): (print("(ident "); DUMP x),
(FUNCALL x):(print("(funcall "); DUMP x)
ESAC; print(")"));
OP DUMP = (DECLSTM x)VOID:
(DUMP (LOC TYPE:=type OF x), print(name OF id OF x), DUMP (LOC EXPR:=value OF x));
OP DUMP = (IFSTM x)VOID:
(DUMP (LOC EXPR:=cond OF x), DUMP then OF x, (else OF x IS NIL|~|DUMP else OF x));
OP DUMP = (WHILESTM x)VOID:
(DUMP (LOC EXPR:=cond OF x), DUMP body OF x);
OP DUMP = (ASSIGN x)VOID:
(DUMP id OF x; DUMP (LOC EXPR:=value OF x));
OP DUMP = (REF STMLIST x)VOID:
(IF x ISNT NIL THEN DUMP stm OF x; DUMP tail OF x FI);
OP DUMP = (REF STM x)VOID:
(CASE x IN
(DECLSTM x): (print("[decl "); DUMP x),
(IFSTM x): (print("[if "); DUMP x),
(WHILESTM x):(print("[while "); DUMP x),
(ASSIGN x): (print("[:= "); DUMP x),
(FUNCALL x): (print("[call "); DUMP x),
(RETURN x): (print("[return "); (value OF x|(EXPR e):DUMP (LOC EXPR:=e)|~)),
(REF STMLIST x): (print("{"); DUMP x; print("}"))
ESAC; print ("]"));
OP DUMP = (PARAM x)VOID:
(print("<"); DUMP (LOC TYPE:=type OF x); print(name OF id OF x); print(">"));
OP DUMP = (DECLFUN x)VOID:
(DUMP (LOC TYPE:=ret type (x)); print(name OF function id(x));
FOR i TO UPB args OF x DO DUMP (args OF x)[i] OD;
DUMP body OF x);
OP DUMP = (DECLS x)VOID:
(DUMP (LOC DECL:=decl OF x); IF tail OF x ISNT NIL THEN DUMP tail OF x FI);
OP DUMP = (REF DECL x)VOID:
(CASE x IN
(DECLFUN f): (print("<fun "); DUMP f),
(DECLSTM s): (print("<stm "); DUMP s)
ESAC; print ((">",new line)));
OP DUMP = (REF TYPE t)VOID:
CASE t IN
(UNIFIER i): (print("*"); DUMP i; print(" ")),
(TYPELNK l): DUMP alias OF l,
(SYMBOL s): DUMP s,
(IDENT i) : (print("'"); DUMP i),
(LISTT t) : (print("[]"); DUMP (LOC TYPE:=lt OF t)),
(PAIRT t) : (print("(,)"); DUMP (LOC TYPE:=lt OF t); DUMP (LOC TYPE:=rt OF t)),
(FUNT t) : (print("->");
FOR i TO UPB args OF t DO DUMP (LOC TYPE:=(args OF t)[i]) OD;
DUMP (LOC TYPE:=ret OF t))
ESAC;