SCM Repository
Annotation of /sml/trunk/src/ml-burg/example1.burg
Parent Directory
|
Revision Log
Revision 9 - (view) (download)
1 : | monnier | 2 | |
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 : | monnier | 8 | fun say s = print s |
75 : | monnier | 2 | |
76 : | |||
77 : | local | ||
78 : | val num = ref 1 | ||
79 : | monnier | 8 | fun inc iref = iref := (!iref + 1) |
80 : | monnier | 2 | in |
81 : | monnier | 8 | fun new s = (s^(Int.toString (!num)) before inc num) |
82 : | monnier | 2 | 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 : | monnier | 8 | say (con^" <- CNSTI "^(Int.toString i)^"\n"); con |
158 : | monnier | 2 | 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 |