nabaztag_hack_kit 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +7 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +4 -0
- data/README.md +119 -0
- data/Rakefile +21 -0
- data/bin/mtl_comp +41 -0
- data/bin/mtl_merge +22 -0
- data/bin/mtl_simu +40 -0
- data/bytecode/lib/buffer.mtl +109 -0
- data/bytecode/lib/button.mtl +27 -0
- data/bytecode/lib/data_helper.mtl +88 -0
- data/bytecode/lib/ear.mtl +90 -0
- data/bytecode/lib/led.mtl +33 -0
- data/bytecode/lib/rfid.mtl +50 -0
- data/bytecode/main.mtl +129 -0
- data/config.ru +6 -0
- data/ext/bytecode/Commands.md +172 -0
- data/ext/bytecode/Docs.md +488 -0
- data/ext/bytecode/README.md +5 -0
- data/ext/bytecode/lib/arp.mtl +159 -0
- data/ext/bytecode/lib/cfg.mtl +74 -0
- data/ext/bytecode/lib/choreos.mtl +1487 -0
- data/ext/bytecode/lib/dhcp.mtl +152 -0
- data/ext/bytecode/lib/dns.mtl +89 -0
- data/ext/bytecode/lib/http.mtl +84 -0
- data/ext/bytecode/lib/tcp.mtl +340 -0
- data/ext/bytecode/lib/udp.mtl +49 -0
- data/ext/bytecode/lib/util.mtl +74 -0
- data/ext/bytecode/lib/var.mtl +15 -0
- data/ext/bytecode/lib/wifi.mtl +243 -0
- data/ext/bytecode/nominal-ping.mtl +5828 -0
- data/ext/mtl/Makefile +42 -0
- data/ext/mtl/README.md +13 -0
- data/ext/mtl/bc.cpp +1891 -0
- data/ext/mtl/conf.bin.sans_password +0 -0
- data/ext/mtl/config.txt +5 -0
- data/ext/mtl/dumpbc.c +2566 -0
- data/ext/mtl/extconf.rb +1 -0
- data/ext/mtl/linux_simu.c +271 -0
- data/ext/mtl/linux_simuaudio.c +16 -0
- data/ext/mtl/linux_simuaudio.h +18 -0
- data/ext/mtl/linux_simunet.c +620 -0
- data/ext/mtl/linux_simunet.h +7 -0
- data/ext/mtl/log.c +297 -0
- data/ext/mtl/log.h +20 -0
- data/ext/mtl/main_compiler.cpp +104 -0
- data/ext/mtl/main_simu.cpp +221 -0
- data/ext/mtl/mp3/GTKANAL.H +97 -0
- data/ext/mtl/mp3/LAYER3.C +2090 -0
- data/ext/mtl/mp3/TABINIT.C +82 -0
- data/ext/mtl/mp3/common.c +265 -0
- data/ext/mtl/mp3/dct64_i386.c +316 -0
- data/ext/mtl/mp3/decode_i386.c +155 -0
- data/ext/mtl/mp3/huffman.h +332 -0
- data/ext/mtl/mp3/interface.c +258 -0
- data/ext/mtl/mp3/mpg123.h +182 -0
- data/ext/mtl/mp3/mpglib.h +44 -0
- data/ext/mtl/properties.c +293 -0
- data/ext/mtl/properties.h +10 -0
- data/ext/mtl/simu.c +750 -0
- data/ext/mtl/simuaudio.c +662 -0
- data/ext/mtl/simuaudio.h +74 -0
- data/ext/mtl/simunet.c +400 -0
- data/ext/mtl/simunet.h +30 -0
- data/ext/mtl/utils/correct_const.sh +34 -0
- data/ext/mtl/vaudio.c +677 -0
- data/ext/mtl/vaudio.h +46 -0
- data/ext/mtl/vbc.h +160 -0
- data/ext/mtl/vbc_str.h +166 -0
- data/ext/mtl/vcomp/Makefile +29 -0
- data/ext/mtl/vcomp/bootstrap.cpp +89 -0
- data/ext/mtl/vcomp/compiler.cpp +470 -0
- data/ext/mtl/vcomp/compiler.h +200 -0
- data/ext/mtl/vcomp/compiler_file.cpp +929 -0
- data/ext/mtl/vcomp/compiler_prog.cpp +250 -0
- data/ext/mtl/vcomp/compiler_term.cpp +1053 -0
- data/ext/mtl/vcomp/compiler_type.cpp +872 -0
- data/ext/mtl/vcomp/compiler_var.cpp +289 -0
- data/ext/mtl/vcomp/file.cpp +79 -0
- data/ext/mtl/vcomp/file.h +39 -0
- data/ext/mtl/vcomp/filesystem.h +14 -0
- data/ext/mtl/vcomp/interpreter.cpp +85 -0
- data/ext/mtl/vcomp/interpreter.h +121 -0
- data/ext/mtl/vcomp/memory.cpp +241 -0
- data/ext/mtl/vcomp/memory.h +326 -0
- data/ext/mtl/vcomp/param.h +95 -0
- data/ext/mtl/vcomp/parser.cpp +427 -0
- data/ext/mtl/vcomp/parser.h +97 -0
- data/ext/mtl/vcomp/parser_xml.cpp +124 -0
- data/ext/mtl/vcomp/prodbuffer.cpp +125 -0
- data/ext/mtl/vcomp/prodbuffer.h +42 -0
- data/ext/mtl/vcomp/resource.h +17 -0
- data/ext/mtl/vcomp/stdlib_core.cpp +122 -0
- data/ext/mtl/vcomp/terminal.cpp +73 -0
- data/ext/mtl/vcomp/terminal.h +30 -0
- data/ext/mtl/vcomp/util.cpp +48 -0
- data/ext/mtl/vcomp/util.h +31 -0
- data/ext/mtl/vinterp.c +1349 -0
- data/ext/mtl/vinterp.h +11 -0
- data/ext/mtl/vloader.c +127 -0
- data/ext/mtl/vloader.h +31 -0
- data/ext/mtl/vlog.c +589 -0
- data/ext/mtl/vlog.h +69 -0
- data/ext/mtl/vmem.c +424 -0
- data/ext/mtl/vmem.h +107 -0
- data/ext/mtl/vnet.c +255 -0
- data/ext/mtl/vnet.h +19 -0
- data/lib/nabaztag_hack_kit/message/api.rb +39 -0
- data/lib/nabaztag_hack_kit/message/helper.rb +39 -0
- data/lib/nabaztag_hack_kit/message.rb +36 -0
- data/lib/nabaztag_hack_kit/server.rb +50 -0
- data/lib/nabaztag_hack_kit/version.rb +3 -0
- data/lib/nabaztag_hack_kit.rb +4 -0
- data/nabaztag_hack_kit.gemspec +29 -0
- data/public/bytecode.bin +0 -0
- data/test/bytecode/helper.mtl +60 -0
- data/test/bytecode/native.mtl +28 -0
- data/test/bytecode/test.mtl +221 -0
- data/test/spec_helper.rb +5 -0
- data/test/unit/message_spec.rb +56 -0
- metadata +209 -0
@@ -0,0 +1,872 @@
|
|
1
|
+
//-------------------
|
2
|
+
// MV
|
3
|
+
// version WIN32 et POCKETPC
|
4
|
+
// Sylvain Huet
|
5
|
+
// Derniere mise a jour : 07/01/2003
|
6
|
+
//
|
7
|
+
|
8
|
+
#include <stdio.h>
|
9
|
+
#include <string.h>
|
10
|
+
|
11
|
+
#include "param.h"
|
12
|
+
#include "terminal.h"
|
13
|
+
#include "memory.h"
|
14
|
+
#include "parser.h"
|
15
|
+
#include "prodbuffer.h"
|
16
|
+
#include "compiler.h"
|
17
|
+
|
18
|
+
// types
|
19
|
+
|
20
|
+
// cr�ation d'un noeud de type basique (�ventuellement param�trique)
|
21
|
+
int Compiler::createnodetypecore(const char* name)
|
22
|
+
{
|
23
|
+
int k;
|
24
|
+
|
25
|
+
int* p=MALLOCCLEAR(m,TYPEHEADER_LENGTH+2);
|
26
|
+
if (!p) return MTLERR_OM;
|
27
|
+
if (STACKPUSH(m,PNTTOVAL(p))) return MTLERR_OM;
|
28
|
+
|
29
|
+
if (k=STRPUSH(m,name)) return k;
|
30
|
+
|
31
|
+
TABSET(m,p,TYPEHEADER_CODE,INTTOVAL(TYPENAME_CORE));
|
32
|
+
TABSET(m,p,TYPEHEADER_LENGTH+1,STACKPULL(m));
|
33
|
+
return 0;
|
34
|
+
}
|
35
|
+
|
36
|
+
// cr�ation d'un noeud de type basique (�ventuellement param�trique)
|
37
|
+
int Compiler::createnodetypecore(int name)
|
38
|
+
{
|
39
|
+
int* p=MALLOCCLEAR(m,TYPEHEADER_LENGTH+2);
|
40
|
+
if (!p) return MTLERR_OM;
|
41
|
+
if (STACKPUSH(m,PNTTOVAL(p))) return MTLERR_OM;
|
42
|
+
|
43
|
+
TABSET(m,p,TYPEHEADER_CODE,INTTOVAL(TYPENAME_CORE));
|
44
|
+
TABSET(m,p,TYPEHEADER_LENGTH+1,name);
|
45
|
+
return 0;
|
46
|
+
}
|
47
|
+
|
48
|
+
// cr�ation d'un noeud de type non basique
|
49
|
+
int Compiler::createnodetype(int type)
|
50
|
+
{
|
51
|
+
int size=0;
|
52
|
+
if ((type==TYPENAME_UNDEF)||(type==TYPENAME_WEAK)) size=0;
|
53
|
+
if ((type==TYPENAME_LIST)||(type==TYPENAME_TAB)||(type==TYPENAME_REC)) size=1;
|
54
|
+
if (type==TYPENAME_FUN) size=2;
|
55
|
+
|
56
|
+
int* p=MALLOCCLEAR(m,TYPEHEADER_LENGTH+size);
|
57
|
+
if (!p) return MTLERR_OM;
|
58
|
+
if (STACKPUSH(m,PNTTOVAL(p))) return MTLERR_OM;
|
59
|
+
|
60
|
+
TABSET(m,p,TYPEHEADER_CODE,INTTOVAL(type));
|
61
|
+
return 0;
|
62
|
+
}
|
63
|
+
|
64
|
+
// cr�ation d'un noeud de type tuple (n �l�ments empil�s)
|
65
|
+
// empile le r�sultat
|
66
|
+
int Compiler::createnodetuple(int size)
|
67
|
+
{
|
68
|
+
int* p=MALLOCCLEAR(m,TYPEHEADER_LENGTH+size);
|
69
|
+
if (!p) return MTLERR_OM;
|
70
|
+
TABSET(m,p,TYPEHEADER_CODE,INTTOVAL(TYPENAME_TUPLE));
|
71
|
+
int i; for(i=size-1;i>=0;i--) TABSET(m,p,TYPEHEADER_LENGTH+i,STACKPULL(m));
|
72
|
+
if (STACKPUSH(m,PNTTOVAL(p))) return MTLERR_OM;
|
73
|
+
return 0;
|
74
|
+
}
|
75
|
+
|
76
|
+
// cr�ation d'un noeud de type tuple dans la compilation de valeurs (n �l�ments empil�s au rangs 0, 2, 4, 2n-2)
|
77
|
+
// empile le r�sultat, sans d�piler les valeurs du tuple
|
78
|
+
int Compiler::createnodetupleval(int size)
|
79
|
+
{
|
80
|
+
int* p=MALLOCCLEAR(m,TYPEHEADER_LENGTH+size);
|
81
|
+
if (!p) return MTLERR_OM;
|
82
|
+
TABSET(m,p,TYPEHEADER_CODE,INTTOVAL(TYPENAME_TUPLE));
|
83
|
+
int i; for(i=size-1;i>=0;i--) TABSET(m,p,TYPEHEADER_LENGTH+i,STACKGET(m,2*(size-1-i)));
|
84
|
+
if (STACKPUSH(m,PNTTOVAL(p))) return MTLERR_OM;
|
85
|
+
return 0;
|
86
|
+
}
|
87
|
+
|
88
|
+
// trouve le type �quivalent
|
89
|
+
int* Compiler::actualtype(int* p)
|
90
|
+
{
|
91
|
+
int vp=TABGET(p,TYPEHEADER_ACTUAL);
|
92
|
+
if (vp!=NIL) return actualtype(VALTOPNT(vp));
|
93
|
+
return p;
|
94
|
+
}
|
95
|
+
|
96
|
+
// production d'un type
|
97
|
+
int Compiler::parsegraph(Parser* p,int env,int mono,int rec,int labels,int newvars,int* rnode)
|
98
|
+
{
|
99
|
+
int k,n;
|
100
|
+
|
101
|
+
if (!p->next(0))
|
102
|
+
{
|
103
|
+
PRINTF(m)(LOG_RUNTIME,"Compiler : uncomplete type reaches EOF\n");
|
104
|
+
return MTLERR_SN;
|
105
|
+
}
|
106
|
+
|
107
|
+
int val;
|
108
|
+
if (!searchlabel_byname(labels,p->token,&val,NULL)) return STACKPUSH(m,val);
|
109
|
+
if ((p->token[0]=='w')&&(isdecimal(p->token+1)))
|
110
|
+
{
|
111
|
+
if (k=createnodetype(TYPENAME_WEAK)) return k;
|
112
|
+
return addlabel(labels,p->token,STACKGET(m,0),NIL);
|
113
|
+
}
|
114
|
+
if (!strcmp(p->token,"_"))
|
115
|
+
{
|
116
|
+
return createnodetype(TYPENAME_WEAK);
|
117
|
+
}
|
118
|
+
if ((p->token[0]=='u')&&(isdecimal(p->token+1)))
|
119
|
+
{
|
120
|
+
if (mono)
|
121
|
+
{
|
122
|
+
PRINTF(m)(LOG_RUNTIME,"Compiler : polymorphism (%s) not accepted here\n",p->token);
|
123
|
+
return MTLERR_SN;
|
124
|
+
}
|
125
|
+
if (!newvars)
|
126
|
+
{
|
127
|
+
PRINTF(m)(LOG_RUNTIME,"Compiler : cannot accept linked variable %s here\n",p->token);
|
128
|
+
return MTLERR_SN;
|
129
|
+
}
|
130
|
+
if (k=createnodetype(TYPENAME_UNDEF)) return k;
|
131
|
+
return addlabel(labels,p->token,STACKGET(m,0),NIL);
|
132
|
+
}
|
133
|
+
else if ((p->token[0]=='r')&&(isdecimal(p->token+1)))
|
134
|
+
{
|
135
|
+
int i=mtl_atoi(p->token+1);
|
136
|
+
if ((i<0)||(i>=rec))
|
137
|
+
{
|
138
|
+
PRINTF(m)(LOG_RUNTIME,"Compiler : recursivity out of range %d [0 %d[\n",i,rec);
|
139
|
+
return MTLERR_SN;
|
140
|
+
}
|
141
|
+
if (k=createnodetype(TYPENAME_REC)) return k;
|
142
|
+
TABSET(m,VALTOPNT(STACKGET(m,0)),TYPEHEADER_LENGTH,INTTOVAL(i));
|
143
|
+
*rnode=1;
|
144
|
+
return 0;
|
145
|
+
}
|
146
|
+
else if (!strcmp(p->token,"tab"))
|
147
|
+
{
|
148
|
+
if (k=createnodetype(TYPENAME_TAB)) return k;
|
149
|
+
if (k=parsegraph(p,env,mono,rec+1,labels,newvars,rnode)) return k;
|
150
|
+
TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0));
|
151
|
+
STACKDROP(m);
|
152
|
+
return 0;
|
153
|
+
}
|
154
|
+
else if (!strcmp(p->token,"list"))
|
155
|
+
{
|
156
|
+
if (k=createnodetype(TYPENAME_LIST)) return k;
|
157
|
+
if (k=parsegraph(p,env,mono,rec+1,labels,newvars,rnode)) return k;
|
158
|
+
TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0));
|
159
|
+
STACKDROP(m);
|
160
|
+
return 0;
|
161
|
+
}
|
162
|
+
else if (!strcmp(p->token,"fun"))
|
163
|
+
{
|
164
|
+
if (k=createnodetype(TYPENAME_FUN)) return k;
|
165
|
+
int nblab;
|
166
|
+
if (newvars)
|
167
|
+
{
|
168
|
+
if (k=parsegraph(p,env,mono,rec+1,labels,1,rnode)) return k;
|
169
|
+
nblab=0;
|
170
|
+
}
|
171
|
+
else
|
172
|
+
{
|
173
|
+
nblab=nblabels(labels);
|
174
|
+
if (k=parsegraph(p,env,mono,rec+1,labels,1,rnode)) return k;
|
175
|
+
nblab=nblabels(labels)-nblab;
|
176
|
+
}
|
177
|
+
TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0));
|
178
|
+
STACKDROP(m);
|
179
|
+
if (k=parsegraph(p,env,mono,rec+1,labels,newvars,rnode)) return k;
|
180
|
+
TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH+1,STACKGET(m,0));
|
181
|
+
STACKDROP(m);
|
182
|
+
removenlabels(labels,nblab);
|
183
|
+
return 0;
|
184
|
+
}
|
185
|
+
else if (!strcmp(p->token,"["))
|
186
|
+
{
|
187
|
+
n=0;
|
188
|
+
while(1)
|
189
|
+
{
|
190
|
+
if (!p->next(0))
|
191
|
+
{
|
192
|
+
PRINTF(m)(LOG_RUNTIME,"Compiler : uncomplete type reaches EOF\n");
|
193
|
+
return MTLERR_SN;
|
194
|
+
}
|
195
|
+
if (!strcmp(p->token,"]"))
|
196
|
+
{
|
197
|
+
return createnodetuple(n);
|
198
|
+
}
|
199
|
+
else
|
200
|
+
{
|
201
|
+
p->giveback();
|
202
|
+
if (k=parsegraph(p,env,mono,rec+1,labels,newvars,rnode)) return k;
|
203
|
+
n++;
|
204
|
+
}
|
205
|
+
}
|
206
|
+
}
|
207
|
+
else if (islabel(p->token))
|
208
|
+
{
|
209
|
+
int* t=searchtype(env,p->token);
|
210
|
+
if (!t)
|
211
|
+
{
|
212
|
+
PRINTF(m)(LOG_RUNTIME,"Compiler : unknown type %s\n",p->token);
|
213
|
+
return MTLERR_SN;
|
214
|
+
}
|
215
|
+
int* q=VALTOPNT(TABGET(t,REF_TYPE));
|
216
|
+
int vargs=TABGET(q,TYPEHEADER_LENGTH);
|
217
|
+
if (vargs==NIL) return STACKPUSH(m,TABGET(t,REF_TYPE));
|
218
|
+
else
|
219
|
+
{
|
220
|
+
if (k=createnodetypecore(TABGET(q,TYPEHEADER_LENGTH+1))) return k;
|
221
|
+
int n=TABLEN(VALTOPNT(vargs));
|
222
|
+
int* t0=MALLOCCLEAR(m,TABLEN(VALTOPNT(vargs)));
|
223
|
+
if (!t0) return MTLERR_OM;
|
224
|
+
if (k=STACKPUSH(m,PNTTOVAL(t0))) return k;
|
225
|
+
if (!p->next(0))
|
226
|
+
{
|
227
|
+
PRINTF(m)(LOG_RUNTIME,"Compiler : '(' expected (found EOF)\n");
|
228
|
+
return MTLERR_SN;
|
229
|
+
}
|
230
|
+
if (strcmp(p->token,"("))
|
231
|
+
{
|
232
|
+
PRINTF(m)(LOG_RUNTIME,"Compiler : '(' expected (found '%s')\n",parser->token);
|
233
|
+
return MTLERR_SN;
|
234
|
+
}
|
235
|
+
int i;for(i=0;i<n;i++)
|
236
|
+
{
|
237
|
+
if (k=parsegraph(p,env,mono,rec+1,labels,newvars,rnode)) return k;
|
238
|
+
TABSET(m,t0,i,STACKPULL(m));
|
239
|
+
}
|
240
|
+
if (!p->next(0))
|
241
|
+
{
|
242
|
+
PRINTF(m)(LOG_RUNTIME,"Compiler : ')' expected (found EOF)\n");
|
243
|
+
return MTLERR_SN;
|
244
|
+
}
|
245
|
+
if (strcmp(p->token,")"))
|
246
|
+
{
|
247
|
+
PRINTF(m)(LOG_RUNTIME,"Compiler : ')' expected (found '%s')\n",parser->token);
|
248
|
+
return MTLERR_SN;
|
249
|
+
}
|
250
|
+
TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0));
|
251
|
+
STACKDROP(m);
|
252
|
+
}
|
253
|
+
}
|
254
|
+
else
|
255
|
+
{
|
256
|
+
PRINTF(m)(LOG_RUNTIME,"Compiler : unknown token %s\n",p->token);
|
257
|
+
return MTLERR_SN;
|
258
|
+
}
|
259
|
+
return 0;
|
260
|
+
}
|
261
|
+
|
262
|
+
// gestion des noeuds rec : on les lie avec le champ ACTUAL
|
263
|
+
int Compiler::parse_rnode(int *p)
|
264
|
+
{
|
265
|
+
int k,i;
|
266
|
+
|
267
|
+
int c=VALTOINT(TABGET(p,TYPEHEADER_CODE));
|
268
|
+
if ((c==TYPENAME_WEAK)||(c==TYPENAME_UNDEF)) return 0; // type faible ou non d�fini, pas de r�cursion
|
269
|
+
if ((c==TYPENAME_CORE)&&(TABGET(p,TYPEHEADER_LENGTH)==NIL)) return 0; // type de base, non param�trique
|
270
|
+
|
271
|
+
if (c==TYPENAME_REC)
|
272
|
+
{
|
273
|
+
TABSET(m,p,TYPEHEADER_ACTUAL,STACKGET(m,VALTOINT(TABGET(p,TYPEHEADER_LENGTH))));
|
274
|
+
return 0;
|
275
|
+
}
|
276
|
+
if (k=STACKPUSH(m,PNTTOVAL(p))) return k;
|
277
|
+
|
278
|
+
if (c==TYPENAME_CORE)
|
279
|
+
{
|
280
|
+
int* tup=VALTOPNT(TABGET(p,TYPEHEADER_LENGTH));
|
281
|
+
for(i=0;i<TABLEN(tup);i++) if (k=parse_rnode(VALTOPNT(TABGET(tup,i)))) return k;
|
282
|
+
}
|
283
|
+
else if (c==TYPENAME_FUN)
|
284
|
+
{
|
285
|
+
if (k=parse_rnode(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
|
286
|
+
if (k=parse_rnode(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1)))) return k;
|
287
|
+
}
|
288
|
+
else if (c==TYPENAME_LIST)
|
289
|
+
{
|
290
|
+
if (k=parse_rnode(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
|
291
|
+
}
|
292
|
+
else if (c==TYPENAME_TAB)
|
293
|
+
{
|
294
|
+
if (k=parse_rnode(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
|
295
|
+
}
|
296
|
+
else if (c==TYPENAME_TUPLE)
|
297
|
+
{
|
298
|
+
for(i=TYPEHEADER_LENGTH;i<TABLEN(p);i++) if (k=parse_rnode(VALTOPNT(TABGET(p,i)))) return k;
|
299
|
+
}
|
300
|
+
STACKDROP(m);
|
301
|
+
return 0;
|
302
|
+
}
|
303
|
+
|
304
|
+
// cr�ation d'un graphe de type directement � partir d'un parser (utile pour les types �crits dans le code source)
|
305
|
+
int Compiler::creategraph(Parser* p,int env,int mono)
|
306
|
+
{
|
307
|
+
int k,labels;
|
308
|
+
int rnode=0;
|
309
|
+
if (k=STACKPUSH(m,NIL)) return k;
|
310
|
+
labels=STACKREF(m);
|
311
|
+
//k=parsegraph(p,env,mono,0,labels,0,&rnode);
|
312
|
+
if (k=parsegraph(p,env,mono,0,labels,0,&rnode)) return k;
|
313
|
+
STACKSET(m,1,STACKGET(m,0));
|
314
|
+
STACKDROP(m);
|
315
|
+
if (rnode) return parse_rnode(VALTOPNT(STACKGET(m,0)));
|
316
|
+
return 0;
|
317
|
+
}
|
318
|
+
|
319
|
+
// cr�ation d'un graphe de type directement � partir d'un parser (utile pour les types �crits dans le code source)
|
320
|
+
// avec une liste de labels pr�-existante
|
321
|
+
int Compiler::creategraph(Parser* p,int env,int mono,int labels)
|
322
|
+
{
|
323
|
+
int k;
|
324
|
+
int rnode=0;
|
325
|
+
if (k=parsegraph(p,env,mono,0,labels,0,&rnode)) return k;
|
326
|
+
if (rnode) return parse_rnode(VALTOPNT(STACKGET(m,0)));
|
327
|
+
return 0;
|
328
|
+
}
|
329
|
+
|
330
|
+
|
331
|
+
// cr�ation d'un graphe de type � partir d'une cha�ne
|
332
|
+
int Compiler::creategraph(const char* src,int env,int mono)
|
333
|
+
{
|
334
|
+
// PRINTF(m)(LOG_DEVCORE,"Compiler : creategraph : %s\n",src);
|
335
|
+
|
336
|
+
Parser* p=new Parser(m->term,src);
|
337
|
+
int k=creategraph(p,env,mono);
|
338
|
+
delete p;
|
339
|
+
return k;
|
340
|
+
}
|
341
|
+
|
342
|
+
|
343
|
+
|
344
|
+
|
345
|
+
int Compiler::recechograph(Prodbuffer *output,int* p,int rec,int labels)
|
346
|
+
{
|
347
|
+
int i,k;
|
348
|
+
p=actualtype(p);
|
349
|
+
if (k=STACKPUSH(m,PNTTOVAL(p))) return k;
|
350
|
+
|
351
|
+
for(i=0;i<rec;i++) if (STACKGET(m,0)==STACKGET(m,i+1))
|
352
|
+
{
|
353
|
+
STACKDROP(m);
|
354
|
+
output->printf("r%d",i);
|
355
|
+
return 0;
|
356
|
+
}
|
357
|
+
int v=VALTOINT(TABGET(p,TYPEHEADER_CODE));
|
358
|
+
if (v==TYPENAME_CORE)
|
359
|
+
{
|
360
|
+
output->printf("%s",STRSTART(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1))));
|
361
|
+
int vargs=TABGET(p,TYPEHEADER_LENGTH);
|
362
|
+
if (vargs!=NIL)
|
363
|
+
{
|
364
|
+
output->printf("(");
|
365
|
+
int* tup=VALTOPNT(vargs);
|
366
|
+
for(i=0;i<TABLEN(tup);i++)
|
367
|
+
{
|
368
|
+
if (i) output->printf(" ");
|
369
|
+
recechograph(output,VALTOPNT(TABGET(tup,i)),rec+1,labels);
|
370
|
+
}
|
371
|
+
output->printf(")");
|
372
|
+
}
|
373
|
+
}
|
374
|
+
else if (v==TYPENAME_FUN)
|
375
|
+
{
|
376
|
+
output->printf("fun ");
|
377
|
+
recechograph(output,VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)),rec+1,labels);
|
378
|
+
output->printf(" ");
|
379
|
+
recechograph(output,VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1)),rec+1,labels);
|
380
|
+
}
|
381
|
+
else if (v==TYPENAME_LIST)
|
382
|
+
{
|
383
|
+
output->printf("list ");
|
384
|
+
recechograph(output,VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)),rec+1,labels);
|
385
|
+
}
|
386
|
+
else if (v==TYPENAME_TAB)
|
387
|
+
{
|
388
|
+
output->printf("tab ");
|
389
|
+
recechograph(output,VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)),rec+1,labels);
|
390
|
+
}
|
391
|
+
else if (v==TYPENAME_TUPLE)
|
392
|
+
{
|
393
|
+
output->printf("[");
|
394
|
+
for(i=TYPEHEADER_LENGTH;i<TABLEN(p);i++)
|
395
|
+
{
|
396
|
+
if (i>TYPEHEADER_LENGTH) output->printf(" ");
|
397
|
+
recechograph(output,VALTOPNT(TABGET(p,i)),rec+1,labels);
|
398
|
+
}
|
399
|
+
output->printf("]");
|
400
|
+
}
|
401
|
+
else if (v==TYPENAME_UNDEF)
|
402
|
+
{
|
403
|
+
char* name;
|
404
|
+
if (!searchlabel_byval(labels,PNTTOVAL(p),&name))
|
405
|
+
output->printf("%s",name);
|
406
|
+
else
|
407
|
+
{
|
408
|
+
char buf[16];
|
409
|
+
sprintf(buf,"u%d",nblabels(labels));
|
410
|
+
addlabel(labels,buf,PNTTOVAL(p),NIL);
|
411
|
+
output->printf("%s",buf);
|
412
|
+
}
|
413
|
+
}
|
414
|
+
else if (v==TYPENAME_WEAK)
|
415
|
+
{
|
416
|
+
char* name;
|
417
|
+
if (!searchlabel_byval(labels,PNTTOVAL(p),&name))
|
418
|
+
output->printf("%s",name);
|
419
|
+
else
|
420
|
+
{
|
421
|
+
char buf[16];
|
422
|
+
sprintf(buf,"w%d",nblabels(labels));
|
423
|
+
addlabel(labels,buf,PNTTOVAL(p),NIL);
|
424
|
+
output->printf("%s",buf);
|
425
|
+
}
|
426
|
+
}
|
427
|
+
STACKDROP(m);
|
428
|
+
return 0;
|
429
|
+
}
|
430
|
+
|
431
|
+
|
432
|
+
int Compiler::echograph(Prodbuffer *output,int* p)
|
433
|
+
{
|
434
|
+
int k,labels;
|
435
|
+
if (k=STACKPUSH(m,NIL)) return k;
|
436
|
+
labels=STACKREF(m);
|
437
|
+
recechograph(output,p,0,labels);
|
438
|
+
STACKDROP(m);
|
439
|
+
return 0;
|
440
|
+
}
|
441
|
+
|
442
|
+
|
443
|
+
// copie de graphe
|
444
|
+
int Compiler::reccopytype(int *p)
|
445
|
+
{
|
446
|
+
int k,i;
|
447
|
+
|
448
|
+
p=actualtype(p);
|
449
|
+
int vq=TABGET(p,TYPEHEADER_COPY);
|
450
|
+
if (vq!=NIL) return STACKPUSH(m,vq); // �l�ment d�j� copi�
|
451
|
+
int c=VALTOINT(TABGET(p,TYPEHEADER_CODE));
|
452
|
+
if ((c==TYPENAME_CORE)&&(TABGET(p,TYPEHEADER_LENGTH)==NIL))
|
453
|
+
return STACKPUSH(m,PNTTOVAL(p)); // type basique, ne pas copier
|
454
|
+
|
455
|
+
if (c==TYPENAME_TUPLE)
|
456
|
+
{
|
457
|
+
for(i=TYPEHEADER_LENGTH;i<TABLEN(p);i++) if (k=STACKPUSH(m,NIL)) return k;
|
458
|
+
if (k=createnodetuple(TABLEN(p)-TYPEHEADER_LENGTH)) return k;
|
459
|
+
TABSET(m,p,TYPEHEADER_COPY,STACKGET(m,0)); // positionne le champ 'copy' de l'original
|
460
|
+
int* q=VALTOPNT(STACKGET(m,0));
|
461
|
+
for(i=TYPEHEADER_LENGTH;i<TABLEN(p);i++)
|
462
|
+
{
|
463
|
+
if (k=reccopytype(VALTOPNT(TABGET(p,i)))) return k;
|
464
|
+
TABSET(m,q,i,STACKPULL(m));
|
465
|
+
}
|
466
|
+
return 0;
|
467
|
+
}
|
468
|
+
|
469
|
+
if (c==TYPENAME_WEAK) return STACKPUSH(m,PNTTOVAL(p)); // type faible, ne pas copier
|
470
|
+
|
471
|
+
if (c==TYPENAME_CORE) k=createnodetypecore(TABGET(p,TYPEHEADER_LENGTH+1));
|
472
|
+
else k=createnodetype(c);
|
473
|
+
if (k) return k; // copie le noeud
|
474
|
+
TABSET(m,p,TYPEHEADER_COPY,STACKGET(m,0)); // positionne le champ 'copy' de l'original
|
475
|
+
|
476
|
+
int* q=VALTOPNT(STACKGET(m,0));
|
477
|
+
if (c==TYPENAME_FUN)
|
478
|
+
{
|
479
|
+
if (k=reccopytype(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
|
480
|
+
TABSET(m,q,TYPEHEADER_LENGTH,STACKPULL(m));
|
481
|
+
if (k=reccopytype(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1)))) return k;
|
482
|
+
TABSET(m,q,TYPEHEADER_LENGTH+1,STACKPULL(m));
|
483
|
+
}
|
484
|
+
else if (c==TYPENAME_LIST)
|
485
|
+
{
|
486
|
+
if (k=reccopytype(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
|
487
|
+
TABSET(m,q,TYPEHEADER_LENGTH,STACKPULL(m));
|
488
|
+
}
|
489
|
+
else if (c==TYPENAME_TAB)
|
490
|
+
{
|
491
|
+
if (k=reccopytype(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
|
492
|
+
TABSET(m,q,TYPEHEADER_LENGTH,STACKPULL(m));
|
493
|
+
}
|
494
|
+
else if (c==TYPENAME_CORE)
|
495
|
+
{
|
496
|
+
int vargs=TABGET(p,TYPEHEADER_LENGTH);
|
497
|
+
if (vargs==NIL) return 0;
|
498
|
+
else
|
499
|
+
{
|
500
|
+
int* tup=VALTOPNT(vargs);
|
501
|
+
for(i=0;i<TABLEN(tup);i++) if (k=reccopytype(VALTOPNT(TABGET(tup,i)))) return k;
|
502
|
+
if (k=DEFTAB(m,TABLEN(tup))) return k;
|
503
|
+
TABSET(m,q,TYPEHEADER_LENGTH,STACKPULL(m));
|
504
|
+
}
|
505
|
+
}
|
506
|
+
else if (c==TYPENAME_UNDEF)
|
507
|
+
{
|
508
|
+
}
|
509
|
+
return 0;
|
510
|
+
}
|
511
|
+
|
512
|
+
// remise � nil du champ 'copy' d'un graphe
|
513
|
+
int Compiler::recresetcopy(int *p)
|
514
|
+
{
|
515
|
+
int k,i;
|
516
|
+
|
517
|
+
p=actualtype(p);
|
518
|
+
int vq=TABGET(p,TYPEHEADER_COPY);
|
519
|
+
if (vq==NIL) return 0; // �l�ment d�j� reset�
|
520
|
+
|
521
|
+
TABSET(m,p,TYPEHEADER_COPY,NIL); // reset le champ 'copy'
|
522
|
+
|
523
|
+
int c=VALTOINT(TABGET(p,TYPEHEADER_CODE));
|
524
|
+
if (c==TYPENAME_WEAK) return 0; // type faible, pas de r�cursion
|
525
|
+
else if (c==TYPENAME_CORE)
|
526
|
+
{
|
527
|
+
int vargs=TABGET(p,TYPEHEADER_LENGTH);
|
528
|
+
if (vargs==NIL) return 0;
|
529
|
+
else
|
530
|
+
{
|
531
|
+
int* tup=VALTOPNT(vargs);
|
532
|
+
for(i=0;i<TABLEN(tup);i++) if (k=recresetcopy(VALTOPNT(TABGET(tup,i)))) return k;
|
533
|
+
}
|
534
|
+
}
|
535
|
+
else if (c==TYPENAME_FUN)
|
536
|
+
{
|
537
|
+
if (k=recresetcopy(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
|
538
|
+
if (k=recresetcopy(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1)))) return k;
|
539
|
+
}
|
540
|
+
else if (c==TYPENAME_LIST)
|
541
|
+
{
|
542
|
+
if (k=recresetcopy(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
|
543
|
+
}
|
544
|
+
else if (c==TYPENAME_TAB)
|
545
|
+
{
|
546
|
+
if (k=recresetcopy(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
|
547
|
+
}
|
548
|
+
else if (c==TYPENAME_TUPLE)
|
549
|
+
{
|
550
|
+
for(i=TYPEHEADER_LENGTH;i<TABLEN(p);i++) if (k=recresetcopy(VALTOPNT(TABGET(p,i)))) return k;
|
551
|
+
}
|
552
|
+
else if (c==TYPENAME_UNDEF)
|
553
|
+
{
|
554
|
+
}
|
555
|
+
return 0;
|
556
|
+
}
|
557
|
+
|
558
|
+
int Compiler::copytype(int *p)
|
559
|
+
{
|
560
|
+
int k;
|
561
|
+
if (k=reccopytype(p)) return k;
|
562
|
+
if (k=recresetcopy(p)) return k;
|
563
|
+
return 0;
|
564
|
+
}
|
565
|
+
|
566
|
+
|
567
|
+
// passage des UNDEF en WEAK
|
568
|
+
int Compiler::recgoweak(int *p)
|
569
|
+
{
|
570
|
+
int k,i;
|
571
|
+
|
572
|
+
p=actualtype(p);
|
573
|
+
int vq=TABGET(p,TYPEHEADER_COPY);
|
574
|
+
if (vq!=NIL) return 0; // �l�ment d�j� trait�
|
575
|
+
int c=VALTOINT(TABGET(p,TYPEHEADER_CODE));
|
576
|
+
if (c==TYPENAME_WEAK) return 0; // type faible, ne pas traiter
|
577
|
+
|
578
|
+
TABSET(m,p,TYPEHEADER_COPY,INTTOVAL(1)); // positionne le champ 'copy' de l'original
|
579
|
+
if (c==TYPENAME_CORE)
|
580
|
+
{
|
581
|
+
int vargs=TABGET(p,TYPEHEADER_LENGTH);
|
582
|
+
if (vargs==NIL) return 0;
|
583
|
+
else
|
584
|
+
{
|
585
|
+
int* tup=VALTOPNT(vargs);
|
586
|
+
for(i=0;i<TABLEN(tup);i++) if (k=recgoweak(VALTOPNT(TABGET(tup,i)))) return k;
|
587
|
+
}
|
588
|
+
}
|
589
|
+
else if (c==TYPENAME_FUN)
|
590
|
+
{
|
591
|
+
if (k=recgoweak(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
|
592
|
+
if (k=recgoweak(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1)))) return k;
|
593
|
+
}
|
594
|
+
else if (c==TYPENAME_LIST)
|
595
|
+
{
|
596
|
+
if (k=recgoweak(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
|
597
|
+
}
|
598
|
+
else if (c==TYPENAME_TAB)
|
599
|
+
{
|
600
|
+
if (k=recgoweak(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH)))) return k;
|
601
|
+
}
|
602
|
+
else if (c==TYPENAME_TUPLE)
|
603
|
+
{
|
604
|
+
for(i=TYPEHEADER_LENGTH;i<TABLEN(p);i++) if (k=recgoweak(VALTOPNT(TABGET(p,i)))) return k;
|
605
|
+
}
|
606
|
+
else if (c==TYPENAME_UNDEF)
|
607
|
+
{
|
608
|
+
TABSET(m,p,TYPEHEADER_CODE,INTTOVAL(TYPENAME_WEAK));
|
609
|
+
}
|
610
|
+
return 0;
|
611
|
+
}
|
612
|
+
|
613
|
+
|
614
|
+
// unification de graphe
|
615
|
+
int Compiler::restoreactual(int* t,int* s,int vt,int vs,int k)
|
616
|
+
{
|
617
|
+
TABSET(m,t,TYPEHEADER_ACTUAL,vt);
|
618
|
+
TABSET(m,s,TYPEHEADER_ACTUAL,vs);
|
619
|
+
return k;
|
620
|
+
}
|
621
|
+
|
622
|
+
int Compiler::recunif(int* s,int* t)
|
623
|
+
{
|
624
|
+
s=actualtype(s);
|
625
|
+
t=actualtype(t);
|
626
|
+
if (s==t) return 0; // ceci g�re le cas des types basiques
|
627
|
+
|
628
|
+
int ns=VALTOINT(TABGET(s,TYPEHEADER_CODE));
|
629
|
+
int nt=VALTOINT(TABGET(t,TYPEHEADER_CODE));
|
630
|
+
int ok=1;
|
631
|
+
if ((ns!=TYPENAME_UNDEF)&&(ns!=TYPENAME_WEAK)
|
632
|
+
&&(nt!=TYPENAME_UNDEF)&&(nt!=TYPENAME_WEAK) // si les deux noeuds bien d�finis ...
|
633
|
+
&&(ns!=nt) ) ok=0;
|
634
|
+
else if ((ns==nt)&&(ns==TYPENAME_CORE)&&(TABGET(s,TYPEHEADER_LENGTH+1)!=TABGET(t,TYPEHEADER_LENGTH+1))) ok=0;
|
635
|
+
if (!ok)
|
636
|
+
{
|
637
|
+
PRINTF(m)(LOG_COMPILER,"Compiler : ");
|
638
|
+
echonode(ns,s);
|
639
|
+
PRINTF(m)(LOG_COMPILER," cannot be unified with ");
|
640
|
+
echonode(nt,t);
|
641
|
+
PRINTF(m)(LOG_COMPILER,"\n");
|
642
|
+
return MTLERR_TYPE; // ... il doivent �tre du m�me type
|
643
|
+
}
|
644
|
+
|
645
|
+
int vt=TABGET(t,TYPEHEADER_ACTUAL); // on sauvegarde avant unification
|
646
|
+
int vs=TABGET(s,TYPEHEADER_ACTUAL);
|
647
|
+
|
648
|
+
if ((ns==TYPENAME_UNDEF) /* union des noeuds */
|
649
|
+
|| ((ns==TYPENAME_WEAK)&&(nt!=TYPENAME_UNDEF)) )
|
650
|
+
{
|
651
|
+
TABSET(m,s,TYPEHEADER_ACTUAL,PNTTOVAL(t));
|
652
|
+
if (ns==TYPENAME_WEAK)
|
653
|
+
{
|
654
|
+
recgoweak(t);
|
655
|
+
recresetcopy(t);
|
656
|
+
}
|
657
|
+
}
|
658
|
+
else
|
659
|
+
{
|
660
|
+
TABSET(m,t,TYPEHEADER_ACTUAL,PNTTOVAL(s));
|
661
|
+
if (nt==TYPENAME_WEAK)
|
662
|
+
{
|
663
|
+
recgoweak(s);
|
664
|
+
recresetcopy(s);
|
665
|
+
}
|
666
|
+
}
|
667
|
+
|
668
|
+
if (ns==nt)
|
669
|
+
{
|
670
|
+
int k;
|
671
|
+
if ((ns==TYPENAME_TAB)||(ns==TYPENAME_LIST)||(ns==TYPENAME_FUN))
|
672
|
+
{
|
673
|
+
if (k=recunif(VALTOPNT(TABGET(s,TYPEHEADER_LENGTH)),VALTOPNT(TABGET(t,TYPEHEADER_LENGTH))))
|
674
|
+
return restoreactual(t,s,vt,vs,k);
|
675
|
+
if ((ns==TYPENAME_FUN)
|
676
|
+
&&(k=recunif(VALTOPNT(TABGET(s,TYPEHEADER_LENGTH+1)),VALTOPNT(TABGET(t,TYPEHEADER_LENGTH+1)))) )
|
677
|
+
return restoreactual(t,s,vt,vs,k);
|
678
|
+
}
|
679
|
+
else if (ns==TYPENAME_TUPLE)
|
680
|
+
{
|
681
|
+
int len=TABLEN(s);
|
682
|
+
if (len!=TABLEN(t)) return restoreactual(t,s,vt,vs,MTLERR_TYPE);
|
683
|
+
int i; for(i=TYPEHEADER_LENGTH;i<len;i++)
|
684
|
+
if (k=recunif(VALTOPNT(TABGET(s,i)),VALTOPNT(TABGET(t,i))))
|
685
|
+
return restoreactual(t,s,vt,vs,k);
|
686
|
+
}
|
687
|
+
else if (ns==TYPENAME_CORE)
|
688
|
+
{
|
689
|
+
int vtups=TABGET(s,TYPEHEADER_LENGTH);
|
690
|
+
int vtupt=TABGET(t,TYPEHEADER_LENGTH);
|
691
|
+
if ((vtups==NIL)&&(vtupt==NIL)) return 0;
|
692
|
+
if ((vtups==NIL)||(vtupt==NIL)) return restoreactual(t,s,vt,vs,MTLERR_TYPE);
|
693
|
+
int* tups=VALTOPNT(vtups);
|
694
|
+
int* tupt=VALTOPNT(vtupt);
|
695
|
+
int len=TABLEN(tups);
|
696
|
+
if (len!=TABLEN(tupt)) return restoreactual(t,s,vt,vs,MTLERR_TYPE);
|
697
|
+
int i; for(i=0;i<len;i++)
|
698
|
+
if (k=recunif(VALTOPNT(TABGET(tups,i)),VALTOPNT(TABGET(tupt,i))))
|
699
|
+
return restoreactual(t,s,vt,vs,k);
|
700
|
+
}
|
701
|
+
}
|
702
|
+
return 0;
|
703
|
+
}
|
704
|
+
|
705
|
+
int Compiler::unif(int* x,int* y)
|
706
|
+
{
|
707
|
+
int l;
|
708
|
+
|
709
|
+
if (!(l=recunif(x,y))) return 0;
|
710
|
+
|
711
|
+
Prodbuffer* output=new Prodbuffer();
|
712
|
+
|
713
|
+
output->printf("Compiler :\n ");
|
714
|
+
echograph(output,x);
|
715
|
+
output->printf("\ndoes not match with\n ");
|
716
|
+
echograph(output,y);
|
717
|
+
output->printf("\n");
|
718
|
+
|
719
|
+
PRINTF(m)(LOG_COMPILER,"%s",output->getstart());
|
720
|
+
delete output;
|
721
|
+
|
722
|
+
return l;
|
723
|
+
}
|
724
|
+
|
725
|
+
// [fun [arg]]
|
726
|
+
int Compiler::unif_argfun()
|
727
|
+
{
|
728
|
+
int k;
|
729
|
+
int* fun=VALTOPNT(STACKPULL(m));
|
730
|
+
int* arg=VALTOPNT(STACKGET(m,0));
|
731
|
+
|
732
|
+
if (k=unif(VALTOPNT(TABGET(fun,TYPEHEADER_LENGTH)),arg)) return k;
|
733
|
+
STACKSET(m,0,TABGET(fun,TYPEHEADER_LENGTH+1));
|
734
|
+
return 0;
|
735
|
+
}
|
736
|
+
|
737
|
+
int* Compiler::argsfromfun(int *f)
|
738
|
+
{
|
739
|
+
return VALTOPNT(TABGET(f,TYPEHEADER_LENGTH));
|
740
|
+
}
|
741
|
+
|
742
|
+
void Compiler::echonode(int code,int* p)
|
743
|
+
{
|
744
|
+
if (code==TYPENAME_CORE) PRINTF(m)(LOG_COMPILER,"%s",STRSTART(VALTOPNT(TABGET(p,TYPEHEADER_LENGTH+1))));
|
745
|
+
else if (code==TYPENAME_UNDEF) PRINTF(m)(LOG_COMPILER,"u*");
|
746
|
+
else if (code==TYPENAME_WEAK) PRINTF(m)(LOG_COMPILER,"w*");
|
747
|
+
else if (code==TYPENAME_TAB) PRINTF(m)(LOG_COMPILER,"tab");
|
748
|
+
else if (code==TYPENAME_LIST) PRINTF(m)(LOG_COMPILER,"list");
|
749
|
+
else if (code==TYPENAME_TUPLE) PRINTF(m)(LOG_COMPILER,"tuple");
|
750
|
+
else if (code==TYPENAME_FUN) PRINTF(m)(LOG_COMPILER,"fun");
|
751
|
+
}
|
752
|
+
|
753
|
+
// unification d'un plus grand vers un plus petit
|
754
|
+
// attention, OPsearch suppose que seul MTLERR_TYPE peut arriver
|
755
|
+
int Compiler::recunifbigger(int* s,int* t)
|
756
|
+
{
|
757
|
+
int* s0=s; // on retient le s initial
|
758
|
+
s=actualtype(s);
|
759
|
+
t=actualtype(t);
|
760
|
+
if (s==t) return 0; // ceci g�re le cas des types basiques
|
761
|
+
|
762
|
+
int ns=VALTOINT(TABGET(s,TYPEHEADER_CODE));
|
763
|
+
int nt=VALTOINT(TABGET(t,TYPEHEADER_CODE));
|
764
|
+
int ok=1;
|
765
|
+
if ((ns!=TYPENAME_UNDEF)&&(ns!=TYPENAME_WEAK)
|
766
|
+
&&(nt!=TYPENAME_UNDEF)&&(nt!=TYPENAME_WEAK) // si les deux noeuds bien d�finis ...
|
767
|
+
&&(ns!=nt) ) ok=0;
|
768
|
+
else if ((ns==nt)&&(ns==TYPENAME_CORE)&&(TABGET(s,TYPEHEADER_LENGTH+1)!=TABGET(t,TYPEHEADER_LENGTH+1))) ok=0;
|
769
|
+
if (!ok)
|
770
|
+
{
|
771
|
+
PRINTF(m)(LOG_COMPILER,"Compiler : ");
|
772
|
+
echonode(ns,s);
|
773
|
+
PRINTF(m)(LOG_COMPILER," cannot be unified with ");
|
774
|
+
echonode(nt,t);
|
775
|
+
PRINTF(m)(LOG_COMPILER,"\n");
|
776
|
+
return MTLERR_TYPE; // ... il doivent �tre du m�me type
|
777
|
+
}
|
778
|
+
|
779
|
+
int vt=TABGET(t,TYPEHEADER_ACTUAL); // on sauvegarde avant unification
|
780
|
+
int vs=TABGET(s,TYPEHEADER_ACTUAL);
|
781
|
+
|
782
|
+
if ((nt==TYPENAME_UNDEF)&&(ns!=TYPENAME_UNDEF))
|
783
|
+
{
|
784
|
+
PRINTF(m)(LOG_COMPILER,"Compiler : ");
|
785
|
+
echonode(ns,s);
|
786
|
+
PRINTF(m)(LOG_COMPILER," is smaller than ");
|
787
|
+
echonode(nt,t);
|
788
|
+
PRINTF(m)(LOG_COMPILER,"\n");
|
789
|
+
return MTLERR_TYPE;
|
790
|
+
}
|
791
|
+
if ((ns==TYPENAME_UNDEF)&&(s0!=s))
|
792
|
+
{
|
793
|
+
PRINTF(m)(LOG_COMPILER,"Compiler : u* already unified\n");
|
794
|
+
return MTLERR_TYPE;
|
795
|
+
}
|
796
|
+
|
797
|
+
if ((ns==TYPENAME_UNDEF) /* union des noeuds */
|
798
|
+
|| ((ns==TYPENAME_WEAK)&&(nt!=TYPENAME_UNDEF)) )
|
799
|
+
{
|
800
|
+
TABSET(m,s,TYPEHEADER_ACTUAL,PNTTOVAL(t));
|
801
|
+
if (ns==TYPENAME_WEAK)
|
802
|
+
{
|
803
|
+
recgoweak(t);
|
804
|
+
recresetcopy(t);
|
805
|
+
}
|
806
|
+
}
|
807
|
+
else
|
808
|
+
{
|
809
|
+
TABSET(m,t,TYPEHEADER_ACTUAL,PNTTOVAL(s));
|
810
|
+
if (nt==TYPENAME_WEAK)
|
811
|
+
{
|
812
|
+
recgoweak(s);
|
813
|
+
recresetcopy(s);
|
814
|
+
}
|
815
|
+
}
|
816
|
+
|
817
|
+
if (ns==nt)
|
818
|
+
{
|
819
|
+
int k;
|
820
|
+
if ((ns==TYPENAME_TAB)||(ns==TYPENAME_LIST)||(ns==TYPENAME_FUN))
|
821
|
+
{
|
822
|
+
if (k=recunifbigger(VALTOPNT(TABGET(s,TYPEHEADER_LENGTH)),VALTOPNT(TABGET(t,TYPEHEADER_LENGTH))))
|
823
|
+
return restoreactual(t,s,vt,vs,k);
|
824
|
+
if ((ns==TYPENAME_FUN)
|
825
|
+
&&(k=recunifbigger(VALTOPNT(TABGET(s,TYPEHEADER_LENGTH+1)),VALTOPNT(TABGET(t,TYPEHEADER_LENGTH+1)))) )
|
826
|
+
return restoreactual(t,s,vt,vs,k);
|
827
|
+
}
|
828
|
+
else if (ns==TYPENAME_TUPLE)
|
829
|
+
{
|
830
|
+
int len=TABLEN(s);
|
831
|
+
if (len!=TABLEN(t)) return restoreactual(t,s,vt,vs,MTLERR_TYPE);
|
832
|
+
int i; for(i=TYPEHEADER_LENGTH;i<len;i++)
|
833
|
+
if (k=recunifbigger(VALTOPNT(TABGET(s,i)),VALTOPNT(TABGET(t,i))))
|
834
|
+
return restoreactual(t,s,vt,vs,k);
|
835
|
+
}
|
836
|
+
else if (ns==TYPENAME_CORE)
|
837
|
+
{
|
838
|
+
int vtups=TABGET(s,TYPEHEADER_LENGTH);
|
839
|
+
int vtupt=TABGET(t,TYPEHEADER_LENGTH);
|
840
|
+
if ((vtups==NIL)&&(vtupt==NIL)) return 0;
|
841
|
+
if ((vtups==NIL)||(vtupt==NIL)) restoreactual(t,s,vt,vs,MTLERR_TYPE);
|
842
|
+
int* tups=VALTOPNT(vtups);
|
843
|
+
int* tupt=VALTOPNT(vtupt);
|
844
|
+
int len=TABLEN(tups);
|
845
|
+
if (len!=TABLEN(tupt)) return restoreactual(t,s,vt,vs,MTLERR_TYPE);
|
846
|
+
int i; for(i=0;i<len;i++)
|
847
|
+
if (k=recunifbigger(VALTOPNT(TABGET(tups,i)),VALTOPNT(TABGET(tupt,i))))
|
848
|
+
return restoreactual(t,s,vt,vs,k);
|
849
|
+
}
|
850
|
+
}
|
851
|
+
return 0;
|
852
|
+
}
|
853
|
+
|
854
|
+
int Compiler::unifbigger(int* x,int* y)
|
855
|
+
{
|
856
|
+
int l;
|
857
|
+
|
858
|
+
if (!(l=recunifbigger(x,y))) return 0;
|
859
|
+
|
860
|
+
Prodbuffer* output=new Prodbuffer();
|
861
|
+
|
862
|
+
output->printf("Compiler :\n ");
|
863
|
+
echograph(output,x);
|
864
|
+
output->printf("\ndoes not match with or is smaller than\n ");
|
865
|
+
echograph(output,y);
|
866
|
+
output->printf("\n");
|
867
|
+
|
868
|
+
PRINTF(m)(LOG_COMPILER,"%s",output->getstart());
|
869
|
+
delete output;
|
870
|
+
|
871
|
+
return l;
|
872
|
+
}
|