Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/ml-burg/example1.burg
ViewVC logotype

Annotation of /sml/trunk/src/ml-burg/example1.burg

Parent Directory Parent Directory | Revision Log Revision Log


Revision 250 - (view) (download)

1 : monnier 249
2 :    
3 :     %{
4 :     (* this is the header *)
5 :     %}
6 :    
7 :    
8 :    
9 :     %term ASGNI
10 :     | ADDI
11 :     | CVCI
12 :     | INDIRC
13 :     | I0I
14 :     | ADDRLP
15 :     | CNSTI
16 :    
17 :     %termprefix T_
18 :    
19 :     %start stmt
20 :    
21 :    
22 :     %%
23 :    
24 :     stmt: ASGNI(disp,reg) = stmt_ASGNI_disp_reg (1);
25 :     stmt: reg = stmt_reg;
26 :     reg: ADDI(reg,rc) = reg_ADDI_reg_rc (1);
27 :     reg: CVCI(INDIRC(disp)) = reg_CVCI_INDIRC_disp (1);
28 :     reg: I0I = reg_I0I;
29 :     reg: disp = reg_disp (1);
30 :     disp: ADDI(reg,con) = disp_ADDI_reg_con;
31 :     disp: ADDRLP = disp_ADDRLP;
32 :     rc: con = rc_con;
33 :     rc: reg = rc_reg;
34 :     con: CNSTI = con_CNSTI;
35 :     con: I0I = con_I0I;
36 :    
37 :    
38 :    
39 :     %%
40 :    
41 :     structure In = struct
42 :    
43 :     open BurmOps
44 :    
45 :     datatype tree =
46 :     ASGNI of tree * tree
47 :     | ADDI of tree * tree
48 :     | CVCI of tree
49 :     | INDIRC of tree
50 :     | I0I
51 :     | ADDRLP of string
52 :     | CNSTI of int
53 :    
54 :     fun opchildren t =
55 :     case t of
56 :     ASGNI (t1,t2) => (T_ASGNI, [t1,t2])
57 :     | ADDI (t1,t2) => (T_ADDI, [t1,t2])
58 :     | CVCI (t1) => (T_CVCI, [t1])
59 :     | INDIRC (t1) => (T_INDIRC, [t1])
60 :     | I0I => (T_I0I, [])
61 :     | ADDRLP _ => (T_ADDRLP, [])
62 :     | CNSTI _ => (T_CNSTI, [])
63 :    
64 :     end
65 :    
66 :    
67 :    
68 :    
69 :     structure Example = struct
70 :    
71 :     structure Burm = BurmGen (In)
72 :     open In
73 :    
74 :     fun say s = print s
75 :    
76 :    
77 :     local
78 :     val num = ref 1
79 :     fun inc iref = iref := (!iref + 1)
80 :     in
81 :     fun new s = (s^(Int.toString (!num)) before inc num)
82 :     end
83 :    
84 :    
85 :     fun walk (Burm.stmt_ASGNI_disp_reg (disp,reg), _) =
86 :     let
87 :     val (disp',reg') = (walk disp, walk reg)
88 :     val stmt = new "stmt"
89 :     in
90 :     say (stmt^" <- ASGNI ("^disp'^" + "^reg'^")\n"); stmt
91 :     end
92 :     | walk (Burm.stmt_reg reg, _) =
93 :     let
94 :     val reg' = walk reg
95 :     val stmt = new "stmt"
96 :     in
97 :     say (stmt^" <- "^reg'^"\n"); stmt
98 :     end
99 :     | walk (Burm.reg_ADDI_reg_rc (reg,rc), _) =
100 :     let
101 :     val (reg',rc') = (walk reg, walk rc)
102 :     val reg2 = new "reg"
103 :     in
104 :     say (reg2^" <- ADDI ("^reg'^","^rc'^")\n"); reg2
105 :     end
106 :     | walk (Burm.reg_CVCI_INDIRC_disp disp, _) =
107 :     let
108 :     val disp' = walk disp
109 :     val reg = new "reg"
110 :     in
111 :     say (reg^" <- CVCI (INDIRC ("^disp'^"))\n"); reg
112 :     end
113 :     | walk (Burm.reg_I0I, _) =
114 :     let
115 :     val reg = new "reg"
116 :     in
117 :     say (reg^" <- ZERO\n"); reg
118 :     end
119 :     | walk (Burm.reg_disp disp, _) =
120 :     let
121 :     val disp' = walk disp
122 :     val reg = new "reg"
123 :     in
124 :     say (reg^" <- "^disp'^"\n"); reg
125 :     end
126 :     | walk (Burm.disp_ADDI_reg_con (reg,con), _) =
127 :     let
128 :     val (reg',con') = (walk reg, walk con)
129 :     val disp = new "disp"
130 :     in
131 :     say (disp^" <- ADDI ("^reg'^","^con'^")\n"); disp
132 :     end
133 :     | walk (Burm.disp_ADDRLP, ADDRLP addr) =
134 :     let
135 :     val disp = new "disp"
136 :     in
137 :     say (disp^" <- ADDRLP "^addr^"\n"); disp
138 :     end
139 :     | walk (Burm.rc_con con, _) =
140 :     let
141 :     val con' = walk con
142 :     val rc = new "rc"
143 :     in
144 :     say (rc^" <- "^con'^"\n"); rc
145 :     end
146 :     | walk (Burm.rc_reg reg, _) =
147 :     let
148 :     val reg' = walk reg
149 :     val rc = new "rc"
150 :     in
151 :     say (rc^" <- "^reg'^"\n"); rc
152 :     end
153 :     | walk (Burm.con_CNSTI, CNSTI i) =
154 :     let
155 :     val con = new "con"
156 :     in
157 :     say (con^" <- CNSTI "^(Int.toString i)^"\n"); con
158 :     end
159 :     | walk (Burm.con_I0I, _) =
160 :     let
161 :     val con = new "con"
162 :     in
163 :     say (con^" <- CNSTI ZERO\n"); con
164 :     end
165 :     | walk _ = (print "Error, bad match in walk\n"; raise Match)
166 :    
167 :    
168 :    
169 :     fun doit t = walk (Burm.reduce t)
170 :    
171 :    
172 :     (*
173 :     * int p;
174 :     * char c;
175 :     * p = c+4;
176 :     *)
177 :     val a = ASGNI (ADDRLP "p",
178 :     ADDI (CVCI (INDIRC (ADDRLP "c")),
179 :     CNSTI 4))
180 :    
181 :     end
182 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0