nabaztag_hack_kit 0.1.0.beta3 → 0.1.0.beta8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (173) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -2
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +2 -2
  5. data/CHANGELOG.md +17 -2
  6. data/LICENSE +21 -0
  7. data/README.md +115 -44
  8. data/Rakefile +2 -6
  9. data/bytecode/{Commands.md → _docs/commands.md} +0 -0
  10. data/bytecode/{Docs.md → _docs/grammar.md} +0 -0
  11. data/bytecode/_docs/grammar.pdf +0 -0
  12. data/bytecode/{src → _original}/README.md +0 -0
  13. data/bytecode/{src → _original}/lib/arp.mtl +0 -0
  14. data/bytecode/{src → _original}/lib/cfg.mtl +0 -0
  15. data/bytecode/{src → _original}/lib/choreos.mtl +0 -0
  16. data/bytecode/{src → _original}/lib/dhcp.mtl +0 -0
  17. data/bytecode/{src → _original}/lib/dns.mtl +0 -0
  18. data/bytecode/{src → _original}/lib/http.mtl +0 -0
  19. data/bytecode/{src → _original}/lib/tcp.mtl +0 -0
  20. data/bytecode/{src → _original}/lib/udp.mtl +0 -0
  21. data/bytecode/{src → _original}/lib/util.mtl +0 -0
  22. data/bytecode/{src → _original}/lib/var.mtl +0 -0
  23. data/bytecode/{src → _original}/lib/wav.mtl +0 -0
  24. data/bytecode/{src → _original}/lib/wifi.mtl +0 -0
  25. data/bytecode/{src → _original}/nominal-ping.mtl +0 -0
  26. data/bytecode/main.mtl +11 -11
  27. data/bytecode/test/test.mtl +8 -8
  28. data/examples/basic/Gemfile +1 -3
  29. data/examples/basic/config.ru +14 -4
  30. data/examples/record/Gemfile +0 -5
  31. data/examples/record/{config.ru.example → config.ru} +2 -2
  32. data/examples/record/server.rb +0 -2
  33. data/ext/Makefile +10 -0
  34. data/ext/bin/mtl_comp +29 -0
  35. data/{bytecode → ext}/bin/mtl_merge +0 -0
  36. data/ext/bin/mtl_simu +29 -0
  37. data/{bytecode/src/mtl → ext}/extconf.rb +0 -0
  38. data/ext/mtl_linux/.gitignore +7 -0
  39. data/ext/mtl_linux/LICENSE +21 -0
  40. data/ext/mtl_linux/Makefile +116 -0
  41. data/ext/mtl_linux/MetalC.project +196 -0
  42. data/ext/mtl_linux/conf.bin +0 -0
  43. data/{bytecode/src/mtl → ext/mtl_linux}/conf.bin.sans_password +0 -0
  44. data/{bytecode/src/mtl → ext/mtl_linux}/config.txt +0 -0
  45. data/ext/mtl_linux/inc/log.h +21 -0
  46. data/{bytecode/src/mtl → ext/mtl_linux/inc}/properties.h +0 -0
  47. data/{bytecode/src/mtl/linux_simuaudio.h → ext/mtl_linux/inc/simu/linux/simuaudio.h} +0 -0
  48. data/{bytecode/src/mtl/linux_simunet.h → ext/mtl_linux/inc/simu/linux/simunet.h} +0 -0
  49. data/{bytecode/src/mtl → ext/mtl_linux/inc/simu/win}/simuaudio.h +18 -18
  50. data/{bytecode/src/mtl → ext/mtl_linux/inc/simu/win}/simunet.h +0 -0
  51. data/ext/mtl_linux/inc/vcomp/compiler.h +200 -0
  52. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/file.h +11 -11
  53. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/filesystem.h +0 -0
  54. data/ext/mtl_linux/inc/vcomp/interpreter.h +121 -0
  55. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/memory.h +120 -92
  56. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/param.h +0 -0
  57. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/parser.h +27 -27
  58. data/ext/mtl_linux/inc/vcomp/prodbuffer.h +42 -0
  59. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/resource.h +1 -1
  60. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/terminal.h +8 -8
  61. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/util.h +7 -7
  62. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vaudio.h +0 -0
  63. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vbc.h +1 -1
  64. data/ext/mtl_linux/inc/vm/vbc_str.h +167 -0
  65. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vinterp.h +0 -0
  66. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vloader.h +0 -0
  67. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vlog.h +0 -0
  68. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vmem.h +0 -0
  69. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vnet.h +0 -0
  70. data/ext/mtl_linux/nominal.mtl +3959 -0
  71. data/ext/mtl_linux/src/comp/main.cpp +123 -0
  72. data/ext/mtl_linux/src/simu/dumpbc.c +2566 -0
  73. data/ext/mtl_linux/src/simu/linux/main.cpp +288 -0
  74. data/ext/mtl_linux/src/simu/linux/simu.c +309 -0
  75. data/ext/mtl_linux/src/simu/linux/simuaudio.c +44 -0
  76. data/ext/mtl_linux/src/simu/linux/simunet.c +707 -0
  77. data/ext/mtl_linux/src/simu/log.c +340 -0
  78. data/ext/mtl_linux/src/simu/properties.c +368 -0
  79. data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/GTKANAL.H +0 -0
  80. data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/LAYER3.C +0 -0
  81. data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/TABINIT.C +0 -0
  82. data/ext/mtl_linux/src/simu/win/mp3/common.c +302 -0
  83. data/ext/mtl_linux/src/simu/win/mp3/dct64_i386.c +316 -0
  84. data/ext/mtl_linux/src/simu/win/mp3/decode_i386.c +160 -0
  85. data/ext/mtl_linux/src/simu/win/mp3/huffman.h +332 -0
  86. data/ext/mtl_linux/src/simu/win/mp3/interface.c +276 -0
  87. data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/mpg123.h +34 -30
  88. data/ext/mtl_linux/src/simu/win/mp3/mpglib.h +47 -0
  89. data/ext/mtl_linux/src/simu/win/simu.c +819 -0
  90. data/ext/mtl_linux/src/simu/win/simuaudio.c +787 -0
  91. data/ext/mtl_linux/src/simu/win/simunet.c +489 -0
  92. data/ext/mtl_linux/src/vcomp/bootstrap.cpp +95 -0
  93. data/ext/mtl_linux/src/vcomp/compiler.cpp +587 -0
  94. data/ext/mtl_linux/src/vcomp/compiler_file.cpp +1253 -0
  95. data/ext/mtl_linux/src/vcomp/compiler_prog.cpp +437 -0
  96. data/ext/mtl_linux/src/vcomp/compiler_term.cpp +1500 -0
  97. data/ext/mtl_linux/src/vcomp/compiler_type.cpp +1238 -0
  98. data/ext/mtl_linux/src/vcomp/compiler_var.cpp +502 -0
  99. data/ext/mtl_linux/src/vcomp/file.cpp +100 -0
  100. data/ext/mtl_linux/src/vcomp/interpreter.cpp +93 -0
  101. data/ext/mtl_linux/src/vcomp/memory.cpp +313 -0
  102. data/ext/mtl_linux/src/vcomp/parser.cpp +584 -0
  103. data/ext/mtl_linux/src/vcomp/parser_xml.cpp +137 -0
  104. data/{bytecode/src/mtl → ext/mtl_linux/src}/vcomp/prodbuffer.cpp +57 -36
  105. data/ext/mtl_linux/src/vcomp/stdlib_core.cpp +130 -0
  106. data/ext/mtl_linux/src/vcomp/terminal.cpp +80 -0
  107. data/{bytecode/src/mtl → ext/mtl_linux/src}/vcomp/util.cpp +18 -11
  108. data/ext/mtl_linux/src/vm/vaudio.c +830 -0
  109. data/ext/mtl_linux/src/vm/vinterp.c +1780 -0
  110. data/ext/mtl_linux/src/vm/vloader.c +139 -0
  111. data/ext/mtl_linux/src/vm/vlog.c +782 -0
  112. data/ext/mtl_linux/src/vm/vmem.c +461 -0
  113. data/ext/mtl_linux/src/vm/vnet.c +298 -0
  114. data/{bytecode/src/mtl → ext/mtl_linux}/utils/correct_const.sh +0 -0
  115. data/lib/nabaztag_hack_kit/server.rb +4 -7
  116. data/lib/nabaztag_hack_kit/version.rb +1 -1
  117. data/lib/nabaztag_hack_kit.rb +2 -2
  118. data/nabaztag_hack_kit.gemspec +10 -11
  119. data/spec/integration/server_spec.rb +3 -3
  120. data/spec/spec_helper.rb +2 -0
  121. data/spec/unit/message_spec.rb +12 -18
  122. data/spec/unit/server_spec.rb +13 -10
  123. metadata +145 -137
  124. data/bytecode/bin/mtl_comp +0 -50
  125. data/bytecode/bin/mtl_simu +0 -49
  126. data/bytecode/src/mtl/Makefile +0 -42
  127. data/bytecode/src/mtl/README.md +0 -13
  128. data/bytecode/src/mtl/bc.cpp +0 -1891
  129. data/bytecode/src/mtl/dumpbc.c +0 -2566
  130. data/bytecode/src/mtl/linux_simu.c +0 -271
  131. data/bytecode/src/mtl/linux_simuaudio.c +0 -16
  132. data/bytecode/src/mtl/linux_simunet.c +0 -620
  133. data/bytecode/src/mtl/log.c +0 -297
  134. data/bytecode/src/mtl/log.h +0 -20
  135. data/bytecode/src/mtl/main_compiler.cpp +0 -104
  136. data/bytecode/src/mtl/main_simu.cpp +0 -221
  137. data/bytecode/src/mtl/mp3/common.c +0 -265
  138. data/bytecode/src/mtl/mp3/dct64_i386.c +0 -316
  139. data/bytecode/src/mtl/mp3/decode_i386.c +0 -155
  140. data/bytecode/src/mtl/mp3/huffman.h +0 -332
  141. data/bytecode/src/mtl/mp3/interface.c +0 -258
  142. data/bytecode/src/mtl/mp3/mpglib.h +0 -44
  143. data/bytecode/src/mtl/properties.c +0 -293
  144. data/bytecode/src/mtl/simu.c +0 -750
  145. data/bytecode/src/mtl/simuaudio.c +0 -662
  146. data/bytecode/src/mtl/simunet.c +0 -400
  147. data/bytecode/src/mtl/vaudio.c +0 -677
  148. data/bytecode/src/mtl/vbc_str.h +0 -166
  149. data/bytecode/src/mtl/vcomp/Makefile +0 -29
  150. data/bytecode/src/mtl/vcomp/bootstrap.cpp +0 -89
  151. data/bytecode/src/mtl/vcomp/compiler.cpp +0 -470
  152. data/bytecode/src/mtl/vcomp/compiler.h +0 -200
  153. data/bytecode/src/mtl/vcomp/compiler_file.cpp +0 -929
  154. data/bytecode/src/mtl/vcomp/compiler_prog.cpp +0 -250
  155. data/bytecode/src/mtl/vcomp/compiler_term.cpp +0 -1053
  156. data/bytecode/src/mtl/vcomp/compiler_type.cpp +0 -872
  157. data/bytecode/src/mtl/vcomp/compiler_var.cpp +0 -289
  158. data/bytecode/src/mtl/vcomp/file.cpp +0 -79
  159. data/bytecode/src/mtl/vcomp/interpreter.cpp +0 -85
  160. data/bytecode/src/mtl/vcomp/interpreter.h +0 -121
  161. data/bytecode/src/mtl/vcomp/memory.cpp +0 -241
  162. data/bytecode/src/mtl/vcomp/parser.cpp +0 -427
  163. data/bytecode/src/mtl/vcomp/parser_xml.cpp +0 -124
  164. data/bytecode/src/mtl/vcomp/prodbuffer.h +0 -42
  165. data/bytecode/src/mtl/vcomp/stdlib_core.cpp +0 -122
  166. data/bytecode/src/mtl/vcomp/terminal.cpp +0 -73
  167. data/bytecode/src/mtl/vinterp.c +0 -1349
  168. data/bytecode/src/mtl/vloader.c +0 -127
  169. data/bytecode/src/mtl/vlog.c +0 -589
  170. data/bytecode/src/mtl/vmem.c +0 -424
  171. data/bytecode/src/mtl/vnet.c +0 -255
  172. data/examples/basic/Procfile +0 -2
  173. data/examples/basic/server.rb +0 -14
@@ -0,0 +1,1253 @@
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
+ #include <stdint.h>
11
+
12
+ #include "param.h"
13
+ #include "terminal.h"
14
+ #include "memory.h"
15
+ #include "parser.h"
16
+ #include "prodbuffer.h"
17
+ #include "compiler.h"
18
+ #include "interpreter.h"
19
+
20
+
21
+ int Compiler::recglobal(int val,Prodbuffer *b)
22
+ {
23
+ if (val==NIL)
24
+ {
25
+ b->addint(-1);
26
+ // printf("nil\n");
27
+ }
28
+ else if (ISVALPNT(val))
29
+ {
30
+ intptr_t* p=VALTOPNT(val);
31
+ if (HEADER_TYPE(p)==TYPE_TAB)
32
+ {
33
+ b->addint((TABLEN(p)<<2)+3);
34
+ // printf("tuple %d @ %x : %x\n",TABLEN(p),val,*p);
35
+ for(int i=0; i<TABLEN(p); i++)
36
+ {
37
+ recglobal(TABGET(p,i),b);
38
+ }
39
+ }
40
+ else
41
+ {
42
+ b->addint((STRLEN(p)<<2)+1);
43
+ b->addstr(STRSTART(p),STRLEN(p));
44
+ // printf("'%s'\n",STRSTART(p));
45
+ }
46
+ }
47
+ else
48
+ {
49
+ b->addint(val);
50
+ // printf("%d\n",VALTOINT(val));
51
+ }
52
+ return 0;
53
+ }
54
+
55
+
56
+ /**
57
+ G�n�re le bytecode correspondant � la d�claration de toutes les
58
+ variables globales
59
+ */
60
+ int Compiler::recglobals(int vlab,Prodbuffer *b)
61
+ {
62
+ if (vlab==NIL)
63
+ {
64
+ return -1;
65
+ }
66
+
67
+ int n=1+recglobals(TABGET(VALTOPNT(vlab),LABELLIST_NEXT),b);
68
+ int val=TABGET(VALTOPNT(vlab),LABELLIST_REF);
69
+
70
+ // printf("%d:%s ",n,STRSTART(VALTOPNT(TABGET(VALTOPNT(vlab),LABELLIST_NAME))));
71
+ // avant de l'enregistrer, on verifie si tout est correct
72
+ intptr_t* p;
73
+ p = searchref_nosetused(PNTTOVAL(newpackage),STRSTART(VALTOPNT(TABGET(VALTOPNT(vlab),LABELLIST_NAME))));
74
+ if (NULL != p)
75
+ {
76
+ if (VALTOINT(TABGET(p,REF_USED)) == 0)
77
+ {
78
+ PRINTF(m)(LOG_WARNING,"%s is declared but never used\n",
79
+ STRSTART(VALTOPNT(TABGET(VALTOPNT(vlab),LABELLIST_NAME))));
80
+ }
81
+ else if (VALTOINT(TABGET(p,REF_CODE)) == CODE_VAR)
82
+ {
83
+ if (VALTOINT(TABGET(p,REF_SET)) == 0)
84
+ {
85
+ if (VALTOINT(TABGET(p,REF_USED)) > VALTOINT(TABGET(p,REF_USED_IN_IFDEF)))
86
+ PRINTF(m)(LOG_WARNING,"%s never gets a value\n",
87
+ STRSTART(VALTOPNT(TABGET(VALTOPNT(vlab),LABELLIST_NAME))));
88
+ }
89
+ else if (VALTOINT(TABGET(p,REF_SET)) == 1)
90
+ PRINTF(m)(LOG_WARNING,"%s is only set once, at declaration. It should be a const.\n",
91
+ STRSTART(VALTOPNT(TABGET(VALTOPNT(vlab),LABELLIST_NAME))));
92
+ }
93
+ }
94
+
95
+ recglobal(val,b);
96
+ return n;
97
+ }
98
+
99
+ int Compiler::recbc(int vref,Prodbuffer *b,Prodbuffer *btab,int offset)
100
+ {
101
+ if (vref==NIL)
102
+ {
103
+ return -1;
104
+ }
105
+ int f=recbc(TABGET(VALTOPNT(vref),REF_NEXTALL),b,btab,offset);
106
+ if (f<-1)
107
+ {
108
+ return f;
109
+ }
110
+ if (VALTOINT(TABGET(VALTOPNT(vref),REF_CODE))<0)
111
+ {
112
+ return f;
113
+ }
114
+ int nf=VALTOINT(TABGET(VALTOPNT(vref),REF_PACKAGE));
115
+ if (nf<=f)
116
+ {
117
+ return f;
118
+ }
119
+ if (TABGET(VALTOPNT(vref),REF_VAL)==NIL)
120
+ {
121
+ printf("%s is EMPTY !!!\n",STRSTART(VALTOPNT(TABGET(VALTOPNT(vref),REF_NAME))));
122
+ return -2;
123
+ }
124
+ intptr_t *fun=VALTOPNT(TABGET(VALTOPNT(vref),REF_VAL));
125
+ int nloc=VALTOINT(TABGET(fun,FUN_NBLOCALS))-VALTOINT(TABGET(fun,FUN_NBARGS));
126
+ int nargs=VALTOINT(TABGET(fun,FUN_NBARGS));
127
+ int ipc=b->getsize()-offset;
128
+ btab->addint(ipc);
129
+ b->addchar(nargs);
130
+ b->addshort(nloc);
131
+ b->addstr(STRSTART(VALTOPNT(TABGET(fun,FUN_BC))),STRLEN(VALTOPNT(TABGET(fun,FUN_BC))));
132
+ printf("%d@%d:%s nargs=%d nlocals=%d / %d bytes\n",nf,ipc,STRSTART(VALTOPNT(TABGET(VALTOPNT(vref),REF_NAME))),nargs,nloc,STRLEN(VALTOPNT(TABGET(fun,FUN_BC))));
133
+ return nf;
134
+ }
135
+
136
+
137
+ // compilation
138
+ // [filename/src packages] -> [packages]
139
+ int Compiler::gocompile(int type)
140
+ {
141
+ int k;
142
+
143
+ if (STACKGET(m,0)==NIL)
144
+ {
145
+ STACKDROP(m);
146
+ return 0;
147
+ }
148
+ char* name=STRSTART(VALTOPNT(STACKGET(m,0)));
149
+ if (type==COMPILE_FROMFILE)
150
+ {
151
+ parser=new Parser(m->term,m->filesystem,name);
152
+ PRINTF(m)(LOG_COMPILER,"Compiler : compiling file '%s'\n",name);
153
+ }
154
+ else
155
+ {
156
+ parser=new Parser(m->term,name);
157
+ name="...";
158
+ PRINTF(m)(LOG_COMPILER,"Compiler : compiling string buffer\n");
159
+ }
160
+
161
+ if (k=createpackage(name,4))
162
+ {
163
+ return k; // [package nom_fichier env]
164
+ }
165
+ TABSET(m,VALTOPNT(STACKGET(m,0)),PACK_NEXT,STACKGET(m,2));
166
+ STACKSET(m,2,STACKGET(m,0)); // [newenv nom_fichier newenv]
167
+ STACKDROPN(m,2); // [newenv]
168
+ newpackage=VALTOPNT(STACKGET(m,0));
169
+ // parsing
170
+
171
+ //### ici on doit pouvoir ajouter la liste des globales et la liste des fonctions
172
+ //### c'est ici �galement qu'on va r�initialiser la structure bc
173
+ if (k=STACKPUSH(m,NIL))
174
+ {
175
+ return k; // GLOBALS
176
+ }
177
+ globals=STACKREF(m);
178
+ ifuns=0;
179
+
180
+ k=parsefile(0);
181
+
182
+ //### c'est fait, on a le bytecode, la liste des fonctions, et la liste des globales
183
+ if (!k)
184
+ {
185
+ Prodbuffer* btab=new Prodbuffer();
186
+
187
+ int n=nblabels(globals);
188
+ brelease->addint(0);
189
+ recglobals(STACKGETFROMREF(m,globals,0),brelease);
190
+ brelease->setint(0,brelease->getsize());
191
+
192
+ int sizebc=brelease->getsize();
193
+ brelease->addint(0); // on pr�pare le champ pour la taille du bytecode
194
+ intptr_t* p=VALTOPNT(TABGET(newpackage,PACK_HACH));
195
+ int vref=TABGET(p,TABLEN(p)-1);
196
+ int nfun=recbc(vref,brelease,btab,sizebc+4);
197
+ if (nfun<0)
198
+ {
199
+ return nfun;
200
+ }
201
+
202
+ brelease->setint(sizebc,brelease->getsize()-sizebc-4);
203
+ brelease->addshort(nfun+1);
204
+ brelease->addstr(btab->getstart(),btab->getsize());
205
+ delete btab;
206
+ }
207
+ if (k)
208
+ {
209
+ parser->echoposition();
210
+ }
211
+ PRINTF(m)(LOG_COMPILER,"\n");
212
+ // dumppackage(STACKGET(m,0));
213
+ delete parser;
214
+ return k;
215
+ }
216
+
217
+
218
+ int Compiler::parsefile(int ifdef)
219
+ {
220
+ int k;
221
+
222
+ while(parser->next(0))
223
+ {
224
+ if (!strcmp(parser->token,"fun"))
225
+ {
226
+ if ((!parser->next(0))||(!islabel(parser->token)))
227
+ {
228
+ if (parser->token)
229
+ {
230
+ PRINTF(m)(LOG_COMPILER,"Compiler : name of function expected (found '%s')\n",parser->token);
231
+ }
232
+ else
233
+ {
234
+ PRINTF(m)(LOG_COMPILER,"Compiler : name of function expected (found EOF)\n");
235
+ }
236
+ return MTLERR_SN;
237
+ }
238
+ if (k=STRPUSH(m,parser->token))
239
+ {
240
+ return k;
241
+ }
242
+ intptr_t* s=VALTOPNT(STACKGET(m,0));
243
+ if (k=parsefun())
244
+ {
245
+ PRINTF(m)(LOG_COMPILER,"Compiler : error compiling function '%s'\n",STRSTART(s));
246
+ return k;
247
+ }
248
+ }
249
+ else if (!strcmp(parser->token,"type"))
250
+ {
251
+ if ((!parser->next(0))||(!islabel(parser->token)))
252
+ {
253
+ if (parser->token)
254
+ {
255
+ PRINTF(m)(LOG_COMPILER,"Compiler : name of type expected (found '%s')\n",parser->token);
256
+ }
257
+ else
258
+ {
259
+ PRINTF(m)(LOG_COMPILER,"Compiler : name of type expected (found EOF)\n");
260
+ }
261
+ return MTLERR_SN;
262
+ }
263
+ if (k=STRPUSH(m,parser->token))
264
+ {
265
+ return k;
266
+ }
267
+ intptr_t* s=VALTOPNT(STACKGET(m,0));
268
+
269
+ if (k=parsetype())
270
+ {
271
+ PRINTF(m)(LOG_COMPILER,"Compiler : error compiling type '%s'\n",STRSTART(s));
272
+ return k;
273
+ }
274
+ }
275
+ else if (!strcmp(parser->token,"var"))
276
+ {
277
+ if ((!parser->next(0))||(!islabel(parser->token)))
278
+ {
279
+ if (parser->token)
280
+ {
281
+ PRINTF(m)(LOG_COMPILER,"Compiler : name of reference expected (found '%s')\n",parser->token);
282
+ }
283
+ else
284
+ {
285
+ PRINTF(m)(LOG_COMPILER,"Compiler : name of reference expected (found EOF)\n");
286
+ }
287
+ return MTLERR_SN;
288
+ }
289
+ if (k=STRPUSH(m,parser->token))
290
+ {
291
+ return k;
292
+ }
293
+ intptr_t* s=VALTOPNT(STACKGET(m,0));
294
+
295
+ if (k=parsevar())
296
+ {
297
+ PRINTF(m)(LOG_COMPILER,"Compiler : error compiling var '%s'\n",STRSTART(s));
298
+ return k;
299
+ }
300
+ }
301
+ else if (!strcmp(parser->token,"const"))
302
+ {
303
+ if ((!parser->next(0))||(!islabel(parser->token)))
304
+ {
305
+ if (parser->token)
306
+ {
307
+ PRINTF(m)(LOG_COMPILER,"Compiler : name of reference expected (found '%s')\n",parser->token);
308
+ }
309
+ else
310
+ {
311
+ PRINTF(m)(LOG_COMPILER,"Compiler : name of reference expected (found EOF)");
312
+ }
313
+ return MTLERR_SN;
314
+ }
315
+ if (k=STRPUSH(m,parser->token))
316
+ {
317
+ return k;
318
+ }
319
+ intptr_t *s=VALTOPNT(STACKGET(m,0));
320
+ if (k=parseconst())
321
+ {
322
+ PRINTF(m)(LOG_COMPILER,"Compiler : error compiling const '%s'\n",STRSTART(s));
323
+ return k;
324
+ }
325
+ }
326
+ else if (!strcmp(parser->token,"proto"))
327
+ {
328
+ if ((!parser->next(0))||(!islabel(parser->token)))
329
+ {
330
+ if (parser->token)
331
+ {
332
+ PRINTF(m)(LOG_COMPILER,"Compiler : name of function expected (found '%s')\n",parser->token);
333
+ }
334
+ else
335
+ {
336
+ PRINTF(m)(LOG_COMPILER,"Compiler : name of function expected (found EOF)\n");
337
+ }
338
+ return MTLERR_SN;
339
+ }
340
+ if (k=STRPUSH(m,parser->token))
341
+ {
342
+ return k;
343
+ }
344
+ intptr_t* s=VALTOPNT(STACKGET(m,0));
345
+
346
+ if (k=parseproto())
347
+ {
348
+ PRINTF(m)(LOG_COMPILER,"Compiler : error compiling proto '%s'\n",STRSTART(s));
349
+ return k;
350
+ }
351
+ }
352
+ else if (!strcmp(parser->token,"ifdef"))
353
+ {
354
+ if (k=parseifdef(0))
355
+ {
356
+ return k;
357
+ }
358
+ }
359
+ else if (!strcmp(parser->token,"ifndef"))
360
+ {
361
+ if (k=parseifdef(1))
362
+ {
363
+ return k;
364
+ }
365
+ }
366
+ else if ((ifdef)&&(!strcmp(parser->token,"}")))
367
+ {
368
+ parser->giveback();
369
+ return 0;
370
+ }
371
+ else
372
+ {
373
+ PRINTF(m)(LOG_COMPILER,"Compiler : unknown token %s\n",parser->token);
374
+ return MTLERR_SN;
375
+ }
376
+ }
377
+ return 0;
378
+ }
379
+
380
+ int Compiler::skipifdef()
381
+ {
382
+ int n=0;
383
+ while(parser->next(0))
384
+ {
385
+ if (!strcmp(parser->token,"{"))
386
+ {
387
+ n++;
388
+ }
389
+ else if (!strcmp(parser->token,"}"))
390
+ {
391
+ n--;
392
+ if (n<0)
393
+ {
394
+ return 0;
395
+ }
396
+ }
397
+ }
398
+ PRINTF(m)(LOG_COMPILER,"Compiler : '}' expected (found EOF)\n");
399
+ return MTLERR_SN;
400
+ }
401
+
402
+ int Compiler::parseifdef(int ifndef)
403
+ {
404
+ int k;
405
+ if (!parser->next(0))
406
+ {
407
+ PRINTF(m)(LOG_COMPILER,"Compiler : label expected (found EOF)\n");
408
+ return MTLERR_SN;
409
+ }
410
+ if (!islabel(parser->token))
411
+ {
412
+ PRINTF(m)(LOG_COMPILER,"Compiler : label expected (found '%s')\n",parser->token);
413
+ return MTLERR_SN;
414
+ }
415
+ int first=1;
416
+
417
+ intptr_t
418
+ *ref, *type;
419
+ if ((!(ref = searchref(PNTTOVAL(newpackage),parser->token)))&&(!(type = searchtype(PNTTOVAL(newpackage),parser->token))))
420
+ {
421
+ first=0;
422
+ }
423
+
424
+ // si c'est une variable on note qu'elle est utlilis� dans un ifdef
425
+ // �a nous permet de savoir, plus tard, si elle est seulement
426
+ // utilis�e dans un/des ifdef - dans ce cas elle n'a pas besoin de
427
+ // valeur - ou aussi autre part - dans ce cas elle a besoin d'�tre
428
+ // sett�e au moins une fois.
429
+ if (ref)
430
+ {
431
+ int curval = VALTOINT(TABGET(ref,REF_USED_IN_IFDEF));
432
+ TABSET(m,ref,REF_USED_IN_IFDEF,INTTOVAL(curval+1));
433
+ }
434
+
435
+ if (ifndef)
436
+ {
437
+ first=!first;
438
+ }
439
+ if (k=parser->parsekeyword("{"))
440
+ {
441
+ return k;
442
+ }
443
+ if (first)
444
+ {
445
+ parsefile(1);
446
+ if (k=parser->parsekeyword("}"))
447
+ {
448
+ return k;
449
+ }
450
+ }
451
+ else if (k=skipifdef())
452
+ {
453
+ return k;
454
+ }
455
+ if (!parser->next(0))
456
+ {
457
+ return 0;
458
+ }
459
+ if (strcmp(parser->token,"else"))
460
+ {
461
+ parser->giveback();
462
+ return 0;
463
+ }
464
+ else
465
+ {
466
+ if (k=parser->parsekeyword("{"))
467
+ {
468
+ return k;
469
+ }
470
+ if (!first)
471
+ {
472
+ parsefile(1);
473
+ if (k=parser->parsekeyword("}"))
474
+ {
475
+ return k;
476
+ }
477
+ }
478
+ else if (k=skipifdef())
479
+ {
480
+ return k;
481
+ }
482
+ }
483
+ return 0;
484
+ }
485
+
486
+ void displaybc(Memory* m,char* src);
487
+
488
+
489
+ // compilation d'une fonction
490
+ // [name] -> 0
491
+ int Compiler::parsefun()
492
+ {
493
+ int k;
494
+ intptr_t* type_result;
495
+ // PRINTF(m)(LOG_DEVCORE,"fonction %s\n",STRSTART(VALTOPNT(STACKGET(m,0))));
496
+
497
+ char* name=STRSTART(VALTOPNT(STACKGET(m,0)));
498
+ // cr�ation des variables de travail
499
+ if (k=STACKPUSH(m,NIL))
500
+ {
501
+ return k; // LOCALS
502
+ }
503
+ locals=STACKREF(m);
504
+
505
+ if (k=createnodetype(TYPENAME_FUN))
506
+ {
507
+ return k;
508
+ }
509
+
510
+ // recherche des arguments
511
+ int narg=0;
512
+ do
513
+ {
514
+ if (!parser->next(0))
515
+ {
516
+ PRINTF(m)(LOG_COMPILER,"Compiler : argument or '=' expected (found EOF)\n");
517
+ return MTLERR_SN;
518
+ }
519
+ if (islabel(parser->token))
520
+ {
521
+ if (k=createnodetype(TYPENAME_UNDEF))
522
+ {
523
+ return k;
524
+ }
525
+ if (k=addlabel(locals,parser->token,INTTOVAL(narg++),STACKGET(m,0)))
526
+ {
527
+ return k;
528
+ }
529
+ }
530
+ else if (strcmp(parser->token,"="))
531
+ {
532
+ PRINTF(m)(LOG_COMPILER,"Compiler : argument or '=' expected (found '%s')\n",parser->token);
533
+ return MTLERR_SN;
534
+ }
535
+ }
536
+ while(strcmp(parser->token,"="));
537
+ // construction du type initial de la fonction
538
+ if (k=createnodetuple(narg))
539
+ {
540
+ return k;
541
+ }
542
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0)); // attachement du noeud tuple au noeud fun
543
+ STACKDROP(m);
544
+
545
+ if (k=createnodetype(TYPENAME_UNDEF))
546
+ {
547
+ return k; // noeud r�sultat
548
+ }
549
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH+1,STACKGET(m,0)); // attachement du noeud resultat au noeud fun
550
+ type_result=VALTOPNT(STACKPULL(m)); // on garde en m�moire le type du r�sultat
551
+ // ici : [type local global name]
552
+
553
+ // on cr�e le bloc fonction
554
+ newref=MALLOCCLEAR(m,REF_LENGTH);
555
+ if (!newref)
556
+ {
557
+ return MTLERR_OM;
558
+ }
559
+ TABSET(m,newref,REF_TYPE,STACKPULL(m));
560
+ TABSET(m,newref,REF_NAME,STACKGET(m,1));
561
+ TABSET(m,newref,REF_CODE,INTTOVAL(narg));
562
+
563
+ // vient d'�tre d�clar�e, pas encore utilis�e
564
+ TABSET(m,newref,REF_USED,INTTOVAL(0));
565
+
566
+ k=findproto(PNTTOVAL(newpackage),newref);
567
+
568
+ TABSET(m,newref,REF_PACKAGE,(k!=NIL)?k:INTTOVAL(ifuns++));
569
+
570
+ if (k=STACKPUSH(m,PNTTOVAL(newref)))
571
+ {
572
+ return MTLERR_OM; // [newref local global name]
573
+ }
574
+ addreftopackage(newref,newpackage);
575
+ STACKDROP(m);
576
+ // [local global name]
577
+
578
+ // on poursuit la compilation vers le corps de la fonction
579
+ nblocals=narg;
580
+
581
+ bc->reinit(); // initialisation de la production de bytecode
582
+
583
+ // [locals globals]
584
+
585
+ // parsing
586
+ if (k=parseprogram())
587
+ {
588
+ return k;
589
+ }
590
+
591
+ // [type locals globals]
592
+ // la pile contient le type du r�sultat de la fonction
593
+ if (k=parser->parsekeyword(";;"))
594
+ {
595
+ return k;
596
+ }
597
+
598
+ // unifier le type r�sultat
599
+ if (k=unif(type_result,VALTOPNT(STACKGET(m,0))))
600
+ {
601
+ return k;
602
+ }
603
+ STACKDROP(m);
604
+ // [locals globals name]
605
+ // cr�er le bloc programme
606
+ intptr_t* fun=MALLOCCLEAR(m,FUN_LENGTH);
607
+ if (!fun)
608
+ {
609
+ return MTLERR_OM;
610
+ }
611
+ TABSET(m,newref,REF_VAL,PNTTOVAL(fun));
612
+
613
+ TABSET(m,fun,FUN_NBARGS,INTTOVAL(narg));
614
+ TABSET(m,fun,FUN_NBLOCALS,INTTOVAL(nblocals));
615
+
616
+ // stocker le bytecode
617
+ bc->addchar(OPret);
618
+
619
+ if (k=STRPUSHBINARY(m,bc->getstart(),bc->getsize()))
620
+ {
621
+ return k;
622
+ }
623
+ TABSET(m,fun,FUN_BC,STACKPULL(m));
624
+
625
+ if (!strcmp(name,"awcConnect"))
626
+ {
627
+ displaybc(m,STRSTART(VALTOPNT(TABGET(fun,FUN_BC))));
628
+ }
629
+
630
+ // construire le tuple des r�f�rences globales
631
+ // int* globalstuple=tuplefromlabels(globals);
632
+ // if (!globalstuple) return MTLERR_OM;
633
+ // TABSET(m,fun,FUN_REF,PNTTOVAL(globalstuple));
634
+ TABSET(m,fun,FUN_REFERENCE,PNTTOVAL(newref));
635
+
636
+ STACKDROPN(m,2);
637
+
638
+ // []
639
+
640
+ // chercher d'�ventuels prototypes
641
+ if (k=fillproto(PNTTOVAL(newpackage),newref))
642
+ {
643
+ return k;
644
+ }
645
+
646
+ outputbuf->reinit();
647
+ outputbuf->printf("Compiler : %s : ",STRSTART(VALTOPNT(TABGET(newref,REF_NAME))));
648
+ echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
649
+ PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
650
+
651
+ return 0;
652
+ }
653
+
654
+ // compilation d'une variable
655
+ // [name] -> 0
656
+ int Compiler::parsevar()
657
+ {
658
+ int k;
659
+ int hasvalue = 0;
660
+
661
+ if (!parser->next(0))
662
+ {
663
+ PRINTF(m)(LOG_COMPILER,"Compiler : ';;' expected (found EOF)\n");
664
+ return MTLERR_SN;
665
+ }
666
+ if (!strcmp(parser->token,"="))
667
+ {
668
+ if (k=parseval())
669
+ {
670
+ return k;
671
+ }
672
+ hasvalue = 1;
673
+ }
674
+ else
675
+ {
676
+ parser->giveback();
677
+ if (k=STACKPUSH(m,NIL))
678
+ {
679
+ return k;
680
+ }
681
+ if (k=createnodetype(TYPENAME_WEAK))
682
+ {
683
+ return k;
684
+ }
685
+ }
686
+ // [val type name]
687
+ if (k=parser->parsekeyword(";;"))
688
+ {
689
+ return k;
690
+ }
691
+
692
+ int val=INTTOVAL(nblabels(globals));
693
+ if (k=addlabel(globals,STRSTART(VALTOPNT(STACKGET(m,2))),val,STACKGET(m,1)))
694
+ {
695
+ return k; // enregistrement d'une nouvelle globale
696
+ }
697
+
698
+ // on cr�e le bloc fonction
699
+ newref=MALLOCCLEAR(m,REF_LENGTH);
700
+ if (!newref)
701
+ {
702
+ return MTLERR_OM;
703
+ }
704
+ TABSET(m,newref,REF_TYPE,STACKPULL(m));
705
+ TABSET(m,newref,REF_VAL,STACKPULL(m));
706
+ TABSET(m,newref,REF_NAME,STACKPULL(m));
707
+ TABSET(m,newref,REF_CODE,INTTOVAL(CODE_VAR));
708
+
709
+ // la variable vient d'�tre cr��, elle n'est donc ni utilis�e ni modifi�e encore
710
+ TABSET(m,newref,REF_USED,INTTOVAL(0));
711
+ TABSET(m,newref,REF_SET,INTTOVAL(hasvalue));
712
+ TABSET(m,newref,REF_USED_IN_IFDEF,INTTOVAL(0));
713
+
714
+ TABSET(m,newref,REF_PACKAGE,val);
715
+
716
+ if (k=STACKPUSH(m,PNTTOVAL(newref)))
717
+ {
718
+ return MTLERR_OM; // [newref]
719
+ }
720
+ addreftopackage(newref,newpackage);
721
+ STACKDROP(m);
722
+
723
+ outputbuf->reinit();
724
+ outputbuf->printf("Compiler : var %s : ",STRSTART(VALTOPNT(TABGET(newref,REF_NAME))));
725
+ echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
726
+ PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
727
+ return 0;
728
+ }
729
+
730
+
731
+ // compilation d'une constante (const var = val;;)
732
+ // [name] -> 0
733
+ int Compiler::parseconst()
734
+ {
735
+ int k;
736
+
737
+ if (k=parser->parsekeyword("="))
738
+ {
739
+ return k;
740
+ }
741
+ if (k=parseval())
742
+ {
743
+ return k;
744
+ }
745
+ if (k=parser->parsekeyword(";;"))
746
+ {
747
+ return k;
748
+ }
749
+
750
+ int val=INTTOVAL(nblabels(globals));
751
+ if (k=addlabel(globals,STRSTART(VALTOPNT(STACKGET(m,2))),val,STACKGET(m,1)))
752
+ {
753
+ return k; // enregistrement d'une nouvelle globale
754
+ }
755
+
756
+ // on cr�e le bloc fonction
757
+ newref=MALLOCCLEAR(m,REF_LENGTH);
758
+ if (!newref)
759
+ {
760
+ return MTLERR_OM;
761
+ }
762
+ TABSET(m,newref,REF_TYPE,STACKPULL(m));
763
+ TABSET(m,newref,REF_VAL,STACKPULL(m));
764
+ TABSET(m,newref,REF_NAME,STACKPULL(m));
765
+ TABSET(m,newref,REF_CODE,INTTOVAL(CODE_CONST));
766
+
767
+ // la constante vient d'�tre cr��e, elle n'est donc pas utilis�e, mais elle a une valeur
768
+ TABSET(m,newref,REF_USED,INTTOVAL(0));
769
+ TABSET(m,newref,REF_SET,INTTOVAL(1));
770
+ TABSET(m,newref,REF_USED_IN_IFDEF,INTTOVAL(0));
771
+
772
+ TABSET(m,newref,REF_PACKAGE,val);
773
+
774
+ if (k=STACKPUSH(m,PNTTOVAL(newref)))
775
+ {
776
+ return MTLERR_OM; // [newref]
777
+ }
778
+ addreftopackage(newref,newpackage);
779
+ STACKDROP(m);
780
+
781
+ outputbuf->reinit();
782
+ outputbuf->printf("Compiler : const %s : ",STRSTART(VALTOPNT(TABGET(newref,REF_NAME))));
783
+ echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
784
+ PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
785
+ return 0;
786
+ }
787
+
788
+
789
+ // compilation d'un prototype
790
+ // [name] -> 0
791
+ int Compiler::parseproto()
792
+ {
793
+ int k;
794
+
795
+ if (!parser->next(0))
796
+ {
797
+ PRINTF(m)(LOG_COMPILER,"Compiler : integer or '=' expected (found EOF)\n");
798
+ return MTLERR_SN;
799
+ }
800
+ int nbarg=-1;
801
+ if (!strcmp(parser->token,"="))
802
+ {
803
+ if (k=creategraph(parser,PNTTOVAL(newpackage),0))
804
+ {
805
+ return k;
806
+ }
807
+ int vp=STACKGET(m,0);
808
+ if (vp!=NIL)
809
+ {
810
+ intptr_t* p=VALTOPNT(vp);
811
+ if (TABGET(p,TYPEHEADER_CODE)==INTTOVAL(TYPENAME_FUN))
812
+ {
813
+ vp=TABGET(p,TYPEHEADER_LENGTH);
814
+ if (vp!=NIL)
815
+ {
816
+ intptr_t* p=VALTOPNT(vp);
817
+ if (TABGET(p,TYPEHEADER_CODE)==INTTOVAL(TYPENAME_TUPLE))
818
+ {
819
+ nbarg=TABLEN(p)-TYPEHEADER_LENGTH;
820
+ }
821
+ }
822
+ }
823
+ }
824
+ if (nbarg<0)
825
+ {
826
+ PRINTF(m)(LOG_COMPILER,"Compiler : function type expected\n");
827
+ return MTLERR_SN;
828
+ }
829
+ }
830
+ else if (isdecimal(parser->token))
831
+ {
832
+ nbarg=mtl_atoi(parser->token);
833
+
834
+ if (k=createnodetype(TYPENAME_FUN))
835
+ {
836
+ return k;
837
+ }
838
+
839
+ int i;
840
+ for(i=0; i<nbarg; i++) if (k=createnodetype(TYPENAME_WEAK))
841
+ {
842
+ return k;
843
+ }
844
+ if (k=createnodetuple(nbarg))
845
+ {
846
+ return k;
847
+ }
848
+
849
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0)); // attachement du noeud tuple au noeud fun
850
+ STACKDROP(m);
851
+
852
+ if (k=createnodetype(TYPENAME_WEAK))
853
+ {
854
+ return k; // noeud r�sultat
855
+ }
856
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH+1,STACKGET(m,0)); // attachement du noeud resultat au noeud fun
857
+ STACKDROP(m);
858
+ }
859
+ if (nbarg<0)
860
+ {
861
+ PRINTF(m)(LOG_COMPILER,"Compiler : integer or '=' expected (found '%s')\n",parser->token);
862
+ return MTLERR_SN;
863
+ }
864
+ if (k=parser->parsekeyword(";;"))
865
+ {
866
+ return k;
867
+ }
868
+ // on cr�e le bloc fonction
869
+ newref=MALLOCCLEAR(m,REF_LENGTH);
870
+ if (!newref)
871
+ {
872
+ return MTLERR_OM;
873
+ }
874
+ TABSET(m,newref,REF_TYPE,STACKPULL(m));
875
+ TABSET(m,newref,REF_NAME,STACKPULL(m));
876
+ TABSET(m,newref,REF_CODE,INTTOVAL(nbarg));
877
+ TABSET(m,newref,REF_PACKAGE,INTTOVAL(ifuns++));
878
+ if (k=STACKPUSH(m,PNTTOVAL(newref)))
879
+ {
880
+ return MTLERR_OM; // [newref]
881
+ }
882
+ addreftopackage(newref,newpackage);
883
+ STACKDROP(m);
884
+
885
+ outputbuf->reinit();
886
+ outputbuf->printf("Compiler : proto %s : ",STRSTART(VALTOPNT(TABGET(newref,REF_NAME))));
887
+ echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
888
+ PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
889
+ return 0;
890
+ }
891
+ // compilation d'un type
892
+ // [name] -> 0
893
+ int Compiler::parsetype()
894
+ {
895
+ int k;
896
+ // PRINTF(m)(LOG_DEVCORE,"type %s\n",STRSTART(VALTOPNT(STACKGET(m,0))));
897
+
898
+ char* name=STRSTART(VALTOPNT(STACKGET(m,0)));
899
+ // cr�ation des variables de travail
900
+ if (k=STACKPUSH(m,NIL))
901
+ {
902
+ return k; // LOCALS
903
+ }
904
+ locals=STACKREF(m);
905
+
906
+ newref=searchemptytype(PNTTOVAL(newpackage),name);
907
+ int mergetype=1;
908
+ if (newref)
909
+ {
910
+ if (k=createnodetypecore(TABGET(VALTOPNT(TABGET(newref,REF_TYPE)),TYPEHEADER_LENGTH+1)))
911
+ {
912
+ return k;
913
+ }
914
+ }
915
+ else
916
+ {
917
+ mergetype=0;
918
+ if (k=createnodetypecore(STACKGET(m,1)))
919
+ {
920
+ return k;
921
+ }
922
+ newref=MALLOCCLEAR(m,REF_LENGTH);
923
+ if (!newref)
924
+ {
925
+ return MTLERR_OM;
926
+ }
927
+ TABSET(m,newref,REF_CODE,INTTOVAL(CODE_EMPTYTYPE));
928
+ TABSET(m,newref,REF_TYPE,STACKGET(m,0));
929
+ if (k=STACKPUSH(m,PNTTOVAL(newref)))
930
+ {
931
+ return MTLERR_OM; // [newtyp local name]
932
+ }
933
+ addreftopackage(newref,newpackage);
934
+ STACKDROP(m);
935
+ }
936
+
937
+ int narg=0;
938
+ if (parser->next(0))
939
+ {
940
+ if (strcmp(parser->token,"("))
941
+ {
942
+ parser->giveback();
943
+ }
944
+ else
945
+ {
946
+ do
947
+ {
948
+ if (!parser->next(0))
949
+ {
950
+ PRINTF(m)(LOG_COMPILER,"Compiler : parameter or ')' expected (found EOF)\n");
951
+ return MTLERR_SN;
952
+ }
953
+ if (islabel(parser->token))
954
+ {
955
+ if (k=createnodetype(TYPENAME_UNDEF))
956
+ {
957
+ return k;
958
+ }
959
+ if (k=addlabel(locals,parser->token,STACKGET(m,0),INTTOVAL(narg++)))
960
+ {
961
+ return k;
962
+ }
963
+ }
964
+ else if (strcmp(parser->token,")"))
965
+ {
966
+ PRINTF(m)(LOG_COMPILER,"Compiler : parameter or ')' expected (found '%s')\n",parser->token);
967
+ return MTLERR_SN;
968
+ }
969
+ }
970
+ while(strcmp(parser->token,")"));
971
+ if (k=DEFTAB(m,narg))
972
+ {
973
+ return k;
974
+ }
975
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0));
976
+ STACKDROP(m);
977
+ }
978
+ }
979
+ if (!mergetype)
980
+ {
981
+ STACKDROP(m);
982
+ }
983
+ else if (k=unif(VALTOPNT(STACKPULL(m)),VALTOPNT(TABGET(newref,REF_TYPE))))
984
+ {
985
+ return k;
986
+ }
987
+
988
+ if (!parser->next(0))
989
+ {
990
+ PRINTF(m)(LOG_COMPILER,"Compiler : '=' or ';;' expected (found EOF)\n");
991
+ return MTLERR_SN;
992
+ }
993
+ if (!strcmp(parser->token,"="))
994
+ {
995
+ if (!parser->next(0))
996
+ {
997
+ PRINTF(m)(LOG_COMPILER,"Compiler : uncomplete type definition (found EOF)\n");
998
+ return MTLERR_SN;
999
+ }
1000
+ if (!strcmp(parser->token,"["))
1001
+ {
1002
+ return parsestruct();
1003
+ }
1004
+ parser->giveback();
1005
+ return parsesum();
1006
+ }
1007
+ else if (!strcmp(parser->token,";;"))
1008
+ {
1009
+ STACKDROPN(m,2);
1010
+ outputbuf->reinit();
1011
+ outputbuf->printf("Compiler : uncompleted type : ");
1012
+ echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
1013
+ PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
1014
+ return 0;
1015
+ }
1016
+ PRINTF(m)(LOG_COMPILER,"Compiler : '=' or ';;' expected (found '%s')\n",parser->token);
1017
+ return MTLERR_SN;
1018
+ }
1019
+
1020
+
1021
+ // compilation d'une structure (le premier '[' a �t� lu)
1022
+ // [locals nom]
1023
+ int Compiler::parsestruct()
1024
+ {
1025
+ int k;
1026
+
1027
+ // on cr�e le bloc type
1028
+ TABSET(m,newref,REF_VAL,INTTOVAL(0));
1029
+ TABSET(m,newref,REF_CODE,INTTOVAL(CODE_STRUCT));
1030
+ // [local name]
1031
+
1032
+ int loop=1;
1033
+ do
1034
+ {
1035
+ if (!parser->next(0))
1036
+ {
1037
+ PRINTF(m)(LOG_COMPILER,"Compiler : field name or ']' expected (found EOF)\n");
1038
+ return MTLERR_SN;
1039
+ }
1040
+ if (islabel(parser->token))
1041
+ {
1042
+ if (k=STRPUSH(m,parser->token))
1043
+ {
1044
+ return k;
1045
+ }
1046
+
1047
+ // on cr�e le bloc champ
1048
+ intptr_t* newfield=MALLOCCLEAR(m,REF_LENGTH);
1049
+ if (!newfield)
1050
+ {
1051
+ return MTLERR_OM;
1052
+ }
1053
+ TABSET(m,newfield,REF_NAME,STACKPULL(m));
1054
+ TABSET(m,newfield,REF_CODE,INTTOVAL(CODE_FIELD));
1055
+ if (k=STACKPUSH(m,PNTTOVAL(newfield)))
1056
+ {
1057
+ return MTLERR_OM; // [newfield local name]
1058
+ }
1059
+ addreftopackage(newfield,newpackage);
1060
+ STACKDROP(m);
1061
+ // [local name]
1062
+ if (k=STACKPUSH(m,TABGET(newref,REF_VAL)))
1063
+ {
1064
+ return k;
1065
+ }
1066
+ if (k=STACKPUSH(m,PNTTOVAL(newref)))
1067
+ {
1068
+ return k;
1069
+ }
1070
+ if (k=DEFTAB(m,FIELD_LENGTH))
1071
+ {
1072
+ return k;
1073
+ }
1074
+ TABSET(m,newfield,REF_VAL,STACKPULL(m));
1075
+
1076
+ TABSET(m,newref,REF_VAL,INTTOVAL(1+VALTOINT(TABGET(newref,REF_VAL)))); // incr�mentation
1077
+
1078
+ if (k=createnodetype(TYPENAME_FUN))
1079
+ {
1080
+ return k;
1081
+ }
1082
+ if (k=STACKPUSH(m,TABGET(newref,REF_TYPE)))
1083
+ {
1084
+ return k;
1085
+ }
1086
+ if (k=createnodetuple(1))
1087
+ {
1088
+ return k;
1089
+ }
1090
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0)); // attachement du noeud tuple au noeud fun
1091
+ STACKDROP(m);
1092
+
1093
+ if ((!parser->next(0))||(strcmp(parser->token,":")))
1094
+ {
1095
+ parser->giveback();
1096
+ k=createnodetype(TYPENAME_WEAK);
1097
+ }
1098
+ else
1099
+ {
1100
+ k=creategraph(parser,PNTTOVAL(newpackage),1,locals);
1101
+ }
1102
+ if (k)
1103
+ {
1104
+ return k;
1105
+ }
1106
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH+1,STACKGET(m,0)); // attachement du noeud resultat au noeud fun
1107
+ STACKDROP(m);
1108
+ TABSET(m,newfield,REF_TYPE,STACKPULL(m));
1109
+
1110
+ outputbuf->reinit();
1111
+ outputbuf->printf("Compiler : %s : ",STRSTART(VALTOPNT(TABGET(newfield,REF_NAME))));
1112
+ echograph(outputbuf,VALTOPNT(TABGET(newfield,REF_TYPE)));
1113
+ PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
1114
+ }
1115
+ else if (!strcmp(parser->token,"]"))
1116
+ {
1117
+ loop=0;
1118
+ }
1119
+ else
1120
+ {
1121
+ PRINTF(m)(LOG_COMPILER,"Compiler : field name or ']' expected (found '%s')\n",parser->token);
1122
+ return MTLERR_SN;
1123
+ }
1124
+ }
1125
+ while(loop);
1126
+ if (k=parser->parsekeyword(";;"))
1127
+ {
1128
+ return k;
1129
+ }
1130
+
1131
+ STACKDROPN(m,2);
1132
+
1133
+ outputbuf->reinit();
1134
+ outputbuf->printf("Compiler : ");
1135
+ echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
1136
+ outputbuf->printf(" : struct (%d)\n",VALTOINT(TABGET(newref,REF_VAL)));
1137
+ PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
1138
+
1139
+ return 0;
1140
+ }
1141
+
1142
+ // compilation d'une somme
1143
+ // [locals nom]
1144
+ int Compiler::parsesum()
1145
+ {
1146
+ int k;
1147
+
1148
+ // on cr�e le bloc type
1149
+ TABSET(m,newref,REF_VAL,INTTOVAL(0));
1150
+ TABSET(m,newref,REF_CODE,INTTOVAL(CODE_SUM));
1151
+ // [local name]
1152
+
1153
+ int loop=1;
1154
+ do
1155
+ {
1156
+ if (!parser->next(0))
1157
+ {
1158
+ PRINTF(m)(LOG_COMPILER,"Compiler : constructor expected (found EOF)\n");
1159
+ return MTLERR_SN;
1160
+ }
1161
+ if (islabel(parser->token))
1162
+ {
1163
+ if (k=STRPUSH(m,parser->token))
1164
+ {
1165
+ return k;
1166
+ }
1167
+
1168
+ // on cr�e le bloc champ
1169
+ intptr_t* newcons=MALLOCCLEAR(m,REF_LENGTH);
1170
+ if (!newcons)
1171
+ {
1172
+ return MTLERR_OM;
1173
+ }
1174
+ TABSET(m,newcons,REF_NAME,STACKPULL(m));
1175
+ if (k=STACKPUSH(m,PNTTOVAL(newcons)))
1176
+ {
1177
+ return MTLERR_OM; // [newcons local name]
1178
+ }
1179
+ addreftopackage(newcons,newpackage);
1180
+ STACKDROP(m);
1181
+ // [local name]
1182
+ TABSET(m,newcons,REF_VAL,TABGET(newref,REF_VAL));
1183
+ TABSET(m,newref,REF_VAL,INTTOVAL(1+VALTOINT(TABGET(newref,REF_VAL)))); // incr�mentation
1184
+
1185
+ if (k=createnodetype(TYPENAME_FUN))
1186
+ {
1187
+ return k;
1188
+ }
1189
+
1190
+ if ((parser->next(0))&&((!strcmp(parser->token,"|"))||(!strcmp(parser->token,";;"))))
1191
+ {
1192
+ parser->giveback();
1193
+ if (k=createnodetuple(0))
1194
+ {
1195
+ return k;
1196
+ }
1197
+ TABSET(m,newcons,REF_CODE,INTTOVAL(CODE_CONS0));
1198
+ }
1199
+ else
1200
+ {
1201
+ parser->giveback();
1202
+ if (k=creategraph(parser,PNTTOVAL(newpackage),1,locals))
1203
+ {
1204
+ return k;
1205
+ }
1206
+ if (k=createnodetuple(1))
1207
+ {
1208
+ return k;
1209
+ }
1210
+ TABSET(m,newcons,REF_CODE,INTTOVAL(CODE_CONS));
1211
+ }
1212
+ TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0)); // attachement du noeud tuple au noeud fun
1213
+ STACKDROP(m);
1214
+ TABSET(m,VALTOPNT(STACKGET(m,0)),TYPEHEADER_LENGTH+1,TABGET(newref,REF_TYPE)); // attachement du type resultat au noeud fun
1215
+ TABSET(m,newcons,REF_TYPE,STACKPULL(m));
1216
+
1217
+ outputbuf->reinit();
1218
+ outputbuf->printf("Compiler : %s : ",STRSTART(VALTOPNT(TABGET(newcons,REF_NAME))));
1219
+ echograph(outputbuf,VALTOPNT(TABGET(newcons,REF_TYPE)));
1220
+ PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
1221
+ }
1222
+ else
1223
+ {
1224
+ PRINTF(m)(LOG_COMPILER,"Compiler : constructor expected (found '%s')\n",parser->token);
1225
+ return MTLERR_SN;
1226
+ }
1227
+
1228
+ if (!parser->next(0))
1229
+ {
1230
+ PRINTF(m)(LOG_COMPILER,"Compiler : '|' or ';;' expected (found EOF)\n");
1231
+ return MTLERR_SN;
1232
+ }
1233
+ if (!strcmp(parser->token,";;"))
1234
+ {
1235
+ loop=0;
1236
+ }
1237
+ else if (strcmp(parser->token,"|"))
1238
+ {
1239
+ PRINTF(m)(LOG_COMPILER,"Compiler : '|' or ';;' expected (found '%s')\n",parser->token);
1240
+ return MTLERR_SN;
1241
+ }
1242
+ }
1243
+ while(loop);
1244
+ STACKDROPN(m,2);
1245
+
1246
+ outputbuf->reinit();
1247
+ outputbuf->printf("Compiler : ");
1248
+ echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
1249
+ outputbuf->printf(" : constructor\n");
1250
+ PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
1251
+
1252
+ return 0;
1253
+ }