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
@@ -1,929 +0,0 @@
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
- #include "interpreter.h"
18
-
19
-
20
- int Compiler::recglobal(int val,Prodbuffer *b)
21
- {
22
- if (val==NIL)
23
- {
24
- b->addint(-1);
25
- // printf("nil\n");
26
- }
27
- else if (ISVALPNT(val))
28
- {
29
- int *p=VALTOPNT(val);
30
- if (HEADER_TYPE(p)==TYPE_TAB)
31
- {
32
- b->addint((TABLEN(p)<<2)+3);
33
- // printf("tuple %d @ %x : %x\n",TABLEN(p),val,*p);
34
- for(int i=0;i<TABLEN(p);i++) recglobal(TABGET(p,i),b);
35
- }
36
- else
37
- {
38
- b->addint((STRLEN(p)<<2)+1);
39
- b->addstr(STRSTART(p),STRLEN(p));
40
- // printf("'%s'\n",STRSTART(p));
41
- }
42
- }
43
- else
44
- {
45
- b->addint(val);
46
- // printf("%d\n",VALTOINT(val));
47
- }
48
- return 0;
49
- }
50
-
51
-
52
- /**
53
- G�n�re le bytecode correspondant � la d�claration de toutes les
54
- variables globales
55
- */
56
- int Compiler::recglobals(int vlab,Prodbuffer *b)
57
- {
58
- if (vlab==NIL) return -1;
59
-
60
- int n=1+recglobals(TABGET(VALTOPNT(vlab),LABELLIST_NEXT),b);
61
- int val=TABGET(VALTOPNT(vlab),LABELLIST_REF);
62
-
63
- // printf("%d:%s ",n,STRSTART(VALTOPNT(TABGET(VALTOPNT(vlab),LABELLIST_NAME))));
64
- // avant de l'enregistrer, on verifie si tout est correct
65
- int* p;
66
- p = searchref_nosetused(PNTTOVAL(newpackage),STRSTART(VALTOPNT(TABGET(VALTOPNT(vlab),LABELLIST_NAME))));
67
- if (NULL != p)
68
- {
69
- if (VALTOINT(TABGET(p,REF_USED)) == 0)
70
- {
71
- PRINTF(m)(LOG_WARNING,"%s is declared but never used\n",
72
- STRSTART(VALTOPNT(TABGET(VALTOPNT(vlab),LABELLIST_NAME))));
73
- }
74
- else if (VALTOINT(TABGET(p,REF_CODE)) == CODE_VAR)
75
- {
76
- if (VALTOINT(TABGET(p,REF_SET)) == 0)
77
- {
78
- if (VALTOINT(TABGET(p,REF_USED)) > VALTOINT(TABGET(p,REF_USED_IN_IFDEF)))
79
- PRINTF(m)(LOG_WARNING,"%s never gets a value\n",
80
- STRSTART(VALTOPNT(TABGET(VALTOPNT(vlab),LABELLIST_NAME))));
81
- }
82
- else if (VALTOINT(TABGET(p,REF_SET)) == 1)
83
- PRINTF(m)(LOG_WARNING,"%s is only set once, at declaration. It should be a const.\n",
84
- STRSTART(VALTOPNT(TABGET(VALTOPNT(vlab),LABELLIST_NAME))));
85
- }
86
- }
87
-
88
- recglobal(val,b);
89
- return n;
90
- }
91
-
92
- int Compiler::recbc(int vref,Prodbuffer *b,Prodbuffer *btab,int offset)
93
- {
94
- if (vref==NIL) return -1;
95
- int f=recbc(TABGET(VALTOPNT(vref),REF_NEXTALL),b,btab,offset);
96
- if (f<-1) return f;
97
- if (VALTOINT(TABGET(VALTOPNT(vref),REF_CODE))<0) return f;
98
- int nf=VALTOINT(TABGET(VALTOPNT(vref),REF_PACKAGE));
99
- if (nf<=f) return f;
100
- if (TABGET(VALTOPNT(vref),REF_VAL)==NIL)
101
- {
102
- printf("%s is EMPTY !!!\n",STRSTART(VALTOPNT(TABGET(VALTOPNT(vref),REF_NAME))));
103
- return -2;
104
- }
105
- int *fun=VALTOPNT(TABGET(VALTOPNT(vref),REF_VAL));
106
- int nloc=VALTOINT(TABGET(fun,FUN_NBLOCALS))-VALTOINT(TABGET(fun,FUN_NBARGS));
107
- int nargs=VALTOINT(TABGET(fun,FUN_NBARGS));
108
- int ipc=b->getsize()-offset;
109
- btab->addint(ipc);
110
- b->addchar(nargs);
111
- b->addshort(nloc);
112
- b->addstr(STRSTART(VALTOPNT(TABGET(fun,FUN_BC))),STRLEN(VALTOPNT(TABGET(fun,FUN_BC))));
113
- 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))));
114
- return nf;
115
- }
116
-
117
-
118
- // compilation
119
- // [filename/src packages] -> [packages]
120
- int Compiler::gocompile(int type)
121
- {
122
- int k;
123
-
124
- if (STACKGET(m,0)==NIL)
125
- {
126
- STACKDROP(m);
127
- return 0;
128
- }
129
- const char* name=STRSTART(VALTOPNT(STACKGET(m,0)));
130
- if (type==COMPILE_FROMFILE)
131
- {
132
- parser=new Parser(m->term,m->filesystem,name);
133
- PRINTF(m)(LOG_COMPILER,"Compiler : compiling file '%s'\n",name);
134
- }
135
- else
136
- {
137
- parser=new Parser(m->term,name);
138
- name="...";
139
- PRINTF(m)(LOG_COMPILER,"Compiler : compiling string buffer\n");
140
- }
141
-
142
- if (k=createpackage(name,4)) return k; // [package nom_fichier env]
143
- TABSET(m,VALTOPNT(STACKGET(m,0)),PACK_NEXT,STACKGET(m,2));
144
- STACKSET(m,2,STACKGET(m,0)); // [newenv nom_fichier newenv]
145
- STACKDROPN(m,2); // [newenv]
146
- newpackage=VALTOPNT(STACKGET(m,0));
147
- // parsing
148
-
149
- //### ici on doit pouvoir ajouter la liste des globales et la liste des fonctions
150
- //### c'est ici �galement qu'on va r�initialiser la structure bc
151
- if (k=STACKPUSH(m,NIL)) return k; // GLOBALS
152
- globals=STACKREF(m);
153
- ifuns=0;
154
-
155
- k=parsefile(0);
156
-
157
- //### c'est fait, on a le bytecode, la liste des fonctions, et la liste des globales
158
- if (!k)
159
- {
160
- Prodbuffer* btab=new Prodbuffer();
161
-
162
- int n=nblabels(globals);
163
- brelease->addint(0);
164
- recglobals(STACKGETFROMREF(m,globals,0),brelease);
165
- brelease->setint(0,brelease->getsize());
166
-
167
- int sizebc=brelease->getsize();
168
- brelease->addint(0); // on pr�pare le champ pour la taille du bytecode
169
- int* p=VALTOPNT(TABGET(newpackage,PACK_HACH));
170
- int vref=TABGET(p,TABLEN(p)-1);
171
- int nfun=recbc(vref,brelease,btab,sizebc+4);
172
- if (nfun<0) return nfun;
173
-
174
- brelease->setint(sizebc,brelease->getsize()-sizebc-4);
175
- brelease->addshort(nfun+1);
176
- brelease->addstr(btab->getstart(),btab->getsize());
177
- delete btab;
178
- }
179
- if (k) parser->echoposition();
180
- PRINTF(m)(LOG_COMPILER,"\n");
181
- // dumppackage(STACKGET(m,0));
182
- delete parser;
183
- return k;
184
- }
185
-
186
-
187
- int Compiler::parsefile(int ifdef)
188
- {
189
- int k;
190
-
191
- while(parser->next(0))
192
- {
193
- if (!strcmp(parser->token,"fun"))
194
- {
195
- if ((!parser->next(0))||(!islabel(parser->token)))
196
- {
197
- if (parser->token) PRINTF(m)(LOG_COMPILER,"Compiler : name of function expected (found '%s')\n",parser->token);
198
- else PRINTF(m)(LOG_COMPILER,"Compiler : name of function expected (found EOF)\n");
199
- return MTLERR_SN;
200
- }
201
- if (k=STRPUSH(m,parser->token)) return k;
202
- int* s=VALTOPNT(STACKGET(m,0));
203
- if (k=parsefun())
204
- {
205
- PRINTF(m)(LOG_COMPILER,"Compiler : error compiling function '%s'\n",STRSTART(s));
206
- return k;
207
- }
208
- }
209
- else if (!strcmp(parser->token,"type"))
210
- {
211
- if ((!parser->next(0))||(!islabel(parser->token)))
212
- {
213
- if (parser->token) PRINTF(m)(LOG_COMPILER,"Compiler : name of type expected (found '%s')\n",parser->token);
214
- else PRINTF(m)(LOG_COMPILER,"Compiler : name of type expected (found EOF)\n");
215
- return MTLERR_SN;
216
- }
217
- if (k=STRPUSH(m,parser->token)) return k;
218
- int* s=VALTOPNT(STACKGET(m,0));
219
-
220
- if (k=parsetype())
221
- {
222
- PRINTF(m)(LOG_COMPILER,"Compiler : error compiling type '%s'\n",STRSTART(s));
223
- return k;
224
- }
225
- }
226
- else if (!strcmp(parser->token,"var"))
227
- {
228
- if ((!parser->next(0))||(!islabel(parser->token)))
229
- {
230
- if (parser->token) PRINTF(m)(LOG_COMPILER,"Compiler : name of reference expected (found '%s')\n",parser->token);
231
- else PRINTF(m)(LOG_COMPILER,"Compiler : name of reference expected (found EOF)\n");
232
- return MTLERR_SN;
233
- }
234
- if (k=STRPUSH(m,parser->token)) return k;
235
- int* s=VALTOPNT(STACKGET(m,0));
236
-
237
- if (k=parsevar())
238
- {
239
- PRINTF(m)(LOG_COMPILER,"Compiler : error compiling var '%s'\n",STRSTART(s));
240
- return k;
241
- }
242
- }
243
- else if (!strcmp(parser->token,"const"))
244
- {
245
- if ((!parser->next(0))||(!islabel(parser->token)))
246
- {
247
- if (parser->token)
248
- PRINTF(m)(LOG_COMPILER,"Compiler : name of reference expected (found '%s')\n",parser->token);
249
- else
250
- PRINTF(m)(LOG_COMPILER,"Compiler : name of reference expected (found EOF)");
251
- return MTLERR_SN;
252
- }
253
- if (k=STRPUSH(m,parser->token)) return k;
254
- int *s=VALTOPNT(STACKGET(m,0));
255
- if (k=parseconst())
256
- {
257
- PRINTF(m)(LOG_COMPILER,"Compiler : error compiling const '%s'\n",STRSTART(s));
258
- return k;
259
- }
260
- }
261
- else if (!strcmp(parser->token,"proto"))
262
- {
263
- if ((!parser->next(0))||(!islabel(parser->token)))
264
- {
265
- if (parser->token) PRINTF(m)(LOG_COMPILER,"Compiler : name of function expected (found '%s')\n",parser->token);
266
- else PRINTF(m)(LOG_COMPILER,"Compiler : name of function expected (found EOF)\n");
267
- return MTLERR_SN;
268
- }
269
- if (k=STRPUSH(m,parser->token)) return k;
270
- int* s=VALTOPNT(STACKGET(m,0));
271
-
272
- if (k=parseproto())
273
- {
274
- PRINTF(m)(LOG_COMPILER,"Compiler : error compiling proto '%s'\n",STRSTART(s));
275
- return k;
276
- }
277
- }
278
- else if (!strcmp(parser->token,"ifdef"))
279
- {
280
- if (k=parseifdef(0)) return k;
281
- }
282
- else if (!strcmp(parser->token,"ifndef"))
283
- {
284
- if (k=parseifdef(1)) return k;
285
- }
286
- else if ((ifdef)&&(!strcmp(parser->token,"}")))
287
- {
288
- parser->giveback();
289
- return 0;
290
- }
291
- else
292
- {
293
- PRINTF(m)(LOG_COMPILER,"Compiler : unknown token %s\n",parser->token);
294
- return MTLERR_SN;
295
- }
296
- }
297
- return 0;
298
- }
299
-
300
- int Compiler::skipifdef()
301
- {
302
- int n=0;
303
- while(parser->next(0))
304
- {
305
- if (!strcmp(parser->token,"{")) n++;
306
- else if (!strcmp(parser->token,"}"))
307
- {
308
- n--;
309
- if (n<0) return 0;
310
- }
311
- }
312
- PRINTF(m)(LOG_COMPILER,"Compiler : '}' expected (found EOF)\n");
313
- return MTLERR_SN;
314
- }
315
-
316
- int Compiler::parseifdef(int ifndef)
317
- {
318
- int k;
319
- if (!parser->next(0))
320
- {
321
- PRINTF(m)(LOG_COMPILER,"Compiler : label expected (found EOF)\n");
322
- return MTLERR_SN;
323
- }
324
- if (!islabel(parser->token))
325
- {
326
- PRINTF(m)(LOG_COMPILER,"Compiler : label expected (found '%s')\n",parser->token);
327
- return MTLERR_SN;
328
- }
329
- int first=1;
330
-
331
- int *ref, *type;
332
- if ((!(ref = searchref(PNTTOVAL(newpackage),parser->token)))&&(!(type = searchtype(PNTTOVAL(newpackage),parser->token))))
333
- first=0;
334
-
335
- // si c'est une variable on note qu'elle est utlilis� dans un ifdef
336
- // �a nous permet de savoir, plus tard, si elle est seulement
337
- // utilis�e dans un/des ifdef - dans ce cas elle n'a pas besoin de
338
- // valeur - ou aussi autre part - dans ce cas elle a besoin d'�tre
339
- // sett�e au moins une fois.
340
- if (ref)
341
- {
342
- int curval = VALTOINT(TABGET(ref,REF_USED_IN_IFDEF));
343
- TABSET(m,ref,REF_USED_IN_IFDEF,INTTOVAL(curval+1));
344
- }
345
-
346
- if (ifndef) first=!first;
347
- if (k=parser->parsekeyword("{")) return k;
348
- if (first)
349
- {
350
- parsefile(1);
351
- if (k=parser->parsekeyword("}")) return k;
352
- }
353
- else if (k=skipifdef()) return k;
354
- if (!parser->next(0)) return 0;
355
- if (strcmp(parser->token,"else"))
356
- {
357
- parser->giveback();
358
- return 0;
359
- }
360
- else
361
- {
362
- if (k=parser->parsekeyword("{")) return k;
363
- if (!first)
364
- {
365
- parsefile(1);
366
- if (k=parser->parsekeyword("}")) return k;
367
- }
368
- else if (k=skipifdef()) return k;
369
- }
370
- return 0;
371
- }
372
-
373
- void displaybc(Memory* m,char* src);
374
-
375
-
376
- // compilation d'une fonction
377
- // [name] -> 0
378
- int Compiler::parsefun()
379
- {
380
- int k;
381
- int* type_result;
382
- // PRINTF(m)(LOG_DEVCORE,"fonction %s\n",STRSTART(VALTOPNT(STACKGET(m,0))));
383
-
384
- char* name=STRSTART(VALTOPNT(STACKGET(m,0)));
385
- // cr�ation des variables de travail
386
- if (k=STACKPUSH(m,NIL)) return k; // LOCALS
387
- locals=STACKREF(m);
388
-
389
- if (k=createnodetype(TYPENAME_FUN)) return k;
390
-
391
- // recherche des arguments
392
- int narg=0;
393
- do
394
- {
395
- if (!parser->next(0))
396
- {
397
- PRINTF(m)(LOG_COMPILER,"Compiler : argument or '=' expected (found EOF)\n");
398
- return MTLERR_SN;
399
- }
400
- if (islabel(parser->token))
401
- {
402
- if (k=createnodetype(TYPENAME_UNDEF)) return k;
403
- if (k=addlabel(locals,parser->token,INTTOVAL(narg++),STACKGET(m,0))) return k;
404
- }
405
- else if (strcmp(parser->token,"="))
406
- {
407
- PRINTF(m)(LOG_COMPILER,"Compiler : argument or '=' expected (found '%s')\n",parser->token);
408
- return MTLERR_SN;
409
- }
410
- } while(strcmp(parser->token,"="));
411
- // construction du type initial de la fonction
412
- if (k=createnodetuple(narg)) return k;
413
- TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0)); // attachement du noeud tuple au noeud fun
414
- STACKDROP(m);
415
-
416
- if (k=createnodetype(TYPENAME_UNDEF)) return k; // noeud r�sultat
417
- TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH+1,STACKGET(m,0)); // attachement du noeud resultat au noeud fun
418
- type_result=VALTOPNT(STACKPULL(m)); // on garde en m�moire le type du r�sultat
419
- // ici : [type local global name]
420
-
421
- // on cr�e le bloc fonction
422
- newref=MALLOCCLEAR(m,REF_LENGTH);
423
- if (!newref) return MTLERR_OM;
424
- TABSET(m,newref,REF_TYPE,STACKPULL(m));
425
- TABSET(m,newref,REF_NAME,STACKGET(m,1));
426
- TABSET(m,newref,REF_CODE,INTTOVAL(narg));
427
-
428
- // vient d'�tre d�clar�e, pas encore utilis�e
429
- TABSET(m,newref,REF_USED,INTTOVAL(0));
430
-
431
- k=findproto(PNTTOVAL(newpackage),newref);
432
-
433
- TABSET(m,newref,REF_PACKAGE,(k!=NIL)?k:INTTOVAL(ifuns++));
434
-
435
- if (k=STACKPUSH(m,PNTTOVAL(newref))) return MTLERR_OM; // [newref local global name]
436
- addreftopackage(newref,newpackage);
437
- STACKDROP(m);
438
- // [local global name]
439
-
440
- // on poursuit la compilation vers le corps de la fonction
441
- nblocals=narg;
442
-
443
- bc->reinit(); // initialisation de la production de bytecode
444
-
445
- // [locals globals]
446
-
447
- // parsing
448
- if (k=parseprogram()) return k;
449
-
450
- // [type locals globals]
451
- // la pile contient le type du r�sultat de la fonction
452
- if (k=parser->parsekeyword(";;")) return k;
453
-
454
- // unifier le type r�sultat
455
- if (k=unif(type_result,VALTOPNT(STACKGET(m,0)))) return k;
456
- STACKDROP(m);
457
- // [locals globals name]
458
- // cr�er le bloc programme
459
- int* fun=MALLOCCLEAR(m,FUN_LENGTH);
460
- if (!fun) return MTLERR_OM;
461
- TABSET(m,newref,REF_VAL,PNTTOVAL(fun));
462
-
463
- TABSET(m,fun,FUN_NBARGS,INTTOVAL(narg));
464
- TABSET(m,fun,FUN_NBLOCALS,INTTOVAL(nblocals));
465
-
466
- // stocker le bytecode
467
- bc->addchar(OPret);
468
-
469
- if (k=STRPUSHBINARY(m,bc->getstart(),bc->getsize())) return k;
470
- TABSET(m,fun,FUN_BC,STACKPULL(m));
471
-
472
- if (!strcmp(name,"awcConnect"))
473
- displaybc(m,STRSTART(VALTOPNT(TABGET(fun,FUN_BC))));
474
-
475
- // construire le tuple des r�f�rences globales
476
- // int* globalstuple=tuplefromlabels(globals);
477
- // if (!globalstuple) return MTLERR_OM;
478
- // TABSET(m,fun,FUN_REF,PNTTOVAL(globalstuple));
479
- TABSET(m,fun,FUN_REFERENCE,PNTTOVAL(newref));
480
-
481
- STACKDROPN(m,2);
482
-
483
- // []
484
-
485
- // chercher d'�ventuels prototypes
486
- if (k=fillproto(PNTTOVAL(newpackage),newref)) return k;
487
-
488
- outputbuf->reinit();
489
- outputbuf->printf("Compiler : %s : ",STRSTART(VALTOPNT(TABGET(newref,REF_NAME))));
490
- echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
491
- PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
492
-
493
- return 0;
494
- }
495
-
496
- // compilation d'une variable
497
- // [name] -> 0
498
- int Compiler::parsevar()
499
- {
500
- int k;
501
- int hasvalue = 0;
502
-
503
- if (!parser->next(0))
504
- {
505
- PRINTF(m)(LOG_COMPILER,"Compiler : ';;' expected (found EOF)\n");
506
- return MTLERR_SN;
507
- }
508
- if (!strcmp(parser->token,"="))
509
- {
510
- if (k=parseval()) return k;
511
- hasvalue = 1;
512
- }
513
- else
514
- {
515
- parser->giveback();
516
- if (k=STACKPUSH(m,NIL)) return k;
517
- if (k=createnodetype(TYPENAME_WEAK)) return k;
518
- }
519
- // [val type name]
520
- if (k=parser->parsekeyword(";;")) return k;
521
-
522
- int val=INTTOVAL(nblabels(globals));
523
- if (k=addlabel(globals,STRSTART(VALTOPNT(STACKGET(m,2))),val,STACKGET(m,1))) return k; // enregistrement d'une nouvelle globale
524
-
525
- // on cr�e le bloc fonction
526
- newref=MALLOCCLEAR(m,REF_LENGTH);
527
- if (!newref) return MTLERR_OM;
528
- TABSET(m,newref,REF_TYPE,STACKPULL(m));
529
- TABSET(m,newref,REF_VAL,STACKPULL(m));
530
- TABSET(m,newref,REF_NAME,STACKPULL(m));
531
- TABSET(m,newref,REF_CODE,INTTOVAL(CODE_VAR));
532
-
533
- // la variable vient d'�tre cr��, elle n'est donc ni utilis�e ni modifi�e encore
534
- TABSET(m,newref,REF_USED,INTTOVAL(0));
535
- TABSET(m,newref,REF_SET,INTTOVAL(hasvalue));
536
- TABSET(m,newref,REF_USED_IN_IFDEF,INTTOVAL(0));
537
-
538
- TABSET(m,newref,REF_PACKAGE,val);
539
-
540
- if (k=STACKPUSH(m,PNTTOVAL(newref))) return MTLERR_OM; // [newref]
541
- addreftopackage(newref,newpackage);
542
- STACKDROP(m);
543
-
544
- outputbuf->reinit();
545
- outputbuf->printf("Compiler : var %s : ",STRSTART(VALTOPNT(TABGET(newref,REF_NAME))));
546
- echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
547
- PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
548
- return 0;
549
- }
550
-
551
-
552
- // compilation d'une constante (const var = val;;)
553
- // [name] -> 0
554
- int Compiler::parseconst()
555
- {
556
- int k;
557
-
558
- if (k=parser->parsekeyword("=")) return k;
559
- if (k=parseval()) return k;
560
- if (k=parser->parsekeyword(";;")) return k;
561
-
562
- int val=INTTOVAL(nblabels(globals));
563
- if (k=addlabel(globals,STRSTART(VALTOPNT(STACKGET(m,2))),val,STACKGET(m,1))) return k; // enregistrement d'une nouvelle globale
564
-
565
- // on cr�e le bloc fonction
566
- newref=MALLOCCLEAR(m,REF_LENGTH);
567
- if (!newref) return MTLERR_OM;
568
- TABSET(m,newref,REF_TYPE,STACKPULL(m));
569
- TABSET(m,newref,REF_VAL,STACKPULL(m));
570
- TABSET(m,newref,REF_NAME,STACKPULL(m));
571
- TABSET(m,newref,REF_CODE,INTTOVAL(CODE_CONST));
572
-
573
- // la constante vient d'�tre cr��e, elle n'est donc pas utilis�e, mais elle a une valeur
574
- TABSET(m,newref,REF_USED,INTTOVAL(0));
575
- TABSET(m,newref,REF_SET,INTTOVAL(1));
576
- TABSET(m,newref,REF_USED_IN_IFDEF,INTTOVAL(0));
577
-
578
- TABSET(m,newref,REF_PACKAGE,val);
579
-
580
- if (k=STACKPUSH(m,PNTTOVAL(newref))) return MTLERR_OM; // [newref]
581
- addreftopackage(newref,newpackage);
582
- STACKDROP(m);
583
-
584
- outputbuf->reinit();
585
- outputbuf->printf("Compiler : const %s : ",STRSTART(VALTOPNT(TABGET(newref,REF_NAME))));
586
- echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
587
- PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
588
- return 0;
589
- }
590
-
591
-
592
- // compilation d'un prototype
593
- // [name] -> 0
594
- int Compiler::parseproto()
595
- {
596
- int k;
597
-
598
- if (!parser->next(0))
599
- {
600
- PRINTF(m)(LOG_COMPILER,"Compiler : integer or '=' expected (found EOF)\n");
601
- return MTLERR_SN;
602
- }
603
- int nbarg=-1;
604
- if (!strcmp(parser->token,"="))
605
- {
606
- if (k=creategraph(parser,PNTTOVAL(newpackage),0)) return k;
607
- int vp=STACKGET(m,0);
608
- if (vp!=NIL)
609
- {
610
- int* p=VALTOPNT(vp);
611
- if (TABGET(p,TYPEHEADER_CODE)==INTTOVAL(TYPENAME_FUN))
612
- {
613
- vp=TABGET(p,TYPEHEADER_LENGTH);
614
- if (vp!=NIL)
615
- {
616
- int* p=VALTOPNT(vp);
617
- if (TABGET(p,TYPEHEADER_CODE)==INTTOVAL(TYPENAME_TUPLE))
618
- {
619
- nbarg=TABLEN(p)-TYPEHEADER_LENGTH;
620
- }
621
- }
622
- }
623
- }
624
- if (nbarg<0)
625
- {
626
- PRINTF(m)(LOG_COMPILER,"Compiler : function type expected\n");
627
- return MTLERR_SN;
628
- }
629
- }
630
- else if (isdecimal(parser->token))
631
- {
632
- nbarg=mtl_atoi(parser->token);
633
-
634
- if (k=createnodetype(TYPENAME_FUN)) return k;
635
-
636
- int i;for(i=0;i<nbarg;i++) if (k=createnodetype(TYPENAME_WEAK)) return k;
637
- if (k=createnodetuple(nbarg)) return k;
638
-
639
- TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0)); // attachement du noeud tuple au noeud fun
640
- STACKDROP(m);
641
-
642
- if (k=createnodetype(TYPENAME_WEAK)) return k; // noeud r�sultat
643
- TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH+1,STACKGET(m,0)); // attachement du noeud resultat au noeud fun
644
- STACKDROP(m);
645
- }
646
- if (nbarg<0)
647
- {
648
- PRINTF(m)(LOG_COMPILER,"Compiler : integer or '=' expected (found '%s')\n",parser->token);
649
- return MTLERR_SN;
650
- }
651
- if (k=parser->parsekeyword(";;")) return k;
652
- // on cr�e le bloc fonction
653
- newref=MALLOCCLEAR(m,REF_LENGTH);
654
- if (!newref) return MTLERR_OM;
655
- TABSET(m,newref,REF_TYPE,STACKPULL(m));
656
- TABSET(m,newref,REF_NAME,STACKPULL(m));
657
- TABSET(m,newref,REF_CODE,INTTOVAL(nbarg));
658
- TABSET(m,newref,REF_PACKAGE,INTTOVAL(ifuns++));
659
- if (k=STACKPUSH(m,PNTTOVAL(newref))) return MTLERR_OM; // [newref]
660
- addreftopackage(newref,newpackage);
661
- STACKDROP(m);
662
-
663
- outputbuf->reinit();
664
- outputbuf->printf("Compiler : proto %s : ",STRSTART(VALTOPNT(TABGET(newref,REF_NAME))));
665
- echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
666
- PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
667
- return 0;
668
- }
669
- // compilation d'un type
670
- // [name] -> 0
671
- int Compiler::parsetype()
672
- {
673
- int k;
674
- // PRINTF(m)(LOG_DEVCORE,"type %s\n",STRSTART(VALTOPNT(STACKGET(m,0))));
675
-
676
- char* name=STRSTART(VALTOPNT(STACKGET(m,0)));
677
- // cr�ation des variables de travail
678
- if (k=STACKPUSH(m,NIL)) return k; // LOCALS
679
- locals=STACKREF(m);
680
-
681
- newref=searchemptytype(PNTTOVAL(newpackage),name);
682
- int mergetype=1;
683
- if (newref)
684
- {
685
- if (k=createnodetypecore(TABGET(VALTOPNT(TABGET(newref,REF_TYPE)),TYPEHEADER_LENGTH+1))) return k;
686
- }
687
- else
688
- {
689
- mergetype=0;
690
- if (k=createnodetypecore(STACKGET(m,1))) return k;
691
- newref=MALLOCCLEAR(m,REF_LENGTH);
692
- if (!newref) return MTLERR_OM;
693
- TABSET(m,newref,REF_CODE,INTTOVAL(CODE_EMPTYTYPE));
694
- TABSET(m,newref,REF_TYPE,STACKGET(m,0));
695
- if (k=STACKPUSH(m,PNTTOVAL(newref))) return MTLERR_OM; // [newtyp local name]
696
- addreftopackage(newref,newpackage);
697
- STACKDROP(m);
698
- }
699
-
700
- int narg=0;
701
- if (parser->next(0))
702
- {
703
- if (strcmp(parser->token,"(")) parser->giveback();
704
- else
705
- {
706
- do
707
- {
708
- if (!parser->next(0))
709
- {
710
- PRINTF(m)(LOG_COMPILER,"Compiler : parameter or ')' expected (found EOF)\n");
711
- return MTLERR_SN;
712
- }
713
- if (islabel(parser->token))
714
- {
715
- if (k=createnodetype(TYPENAME_UNDEF)) return k;
716
- if (k=addlabel(locals,parser->token,STACKGET(m,0),INTTOVAL(narg++))) return k;
717
- }
718
- else if (strcmp(parser->token,")"))
719
- {
720
- PRINTF(m)(LOG_COMPILER,"Compiler : parameter or ')' expected (found '%s')\n",parser->token);
721
- return MTLERR_SN;
722
- }
723
- } while(strcmp(parser->token,")"));
724
- if (k=DEFTAB(m,narg)) return k;
725
- TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0));
726
- STACKDROP(m);
727
- }
728
- }
729
- if (!mergetype) STACKDROP(m);
730
- else if (k=unif(VALTOPNT(STACKPULL(m)),VALTOPNT(TABGET(newref,REF_TYPE)))) return k;
731
-
732
- if (!parser->next(0))
733
- {
734
- PRINTF(m)(LOG_COMPILER,"Compiler : '=' or ';;' expected (found EOF)\n");
735
- return MTLERR_SN;
736
- }
737
- if (!strcmp(parser->token,"="))
738
- {
739
- if (!parser->next(0))
740
- {
741
- PRINTF(m)(LOG_COMPILER,"Compiler : uncomplete type definition (found EOF)\n");
742
- return MTLERR_SN;
743
- }
744
- if (!strcmp(parser->token,"[")) return parsestruct();
745
- parser->giveback();
746
- return parsesum();
747
- }
748
- else if (!strcmp(parser->token,";;"))
749
- {
750
- STACKDROPN(m,2);
751
- outputbuf->reinit();
752
- outputbuf->printf("Compiler : uncompleted type : ");
753
- echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
754
- PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
755
- return 0;
756
- }
757
- PRINTF(m)(LOG_COMPILER,"Compiler : '=' or ';;' expected (found '%s')\n",parser->token);
758
- return MTLERR_SN;
759
- }
760
-
761
-
762
- // compilation d'une structure (le premier '[' a �t� lu)
763
- // [locals nom]
764
- int Compiler::parsestruct()
765
- {
766
- int k;
767
-
768
- // on cr�e le bloc type
769
- TABSET(m,newref,REF_VAL,INTTOVAL(0));
770
- TABSET(m,newref,REF_CODE,INTTOVAL(CODE_STRUCT));
771
- // [local name]
772
-
773
- int loop=1;
774
- do
775
- {
776
- if (!parser->next(0))
777
- {
778
- PRINTF(m)(LOG_COMPILER,"Compiler : field name or ']' expected (found EOF)\n");
779
- return MTLERR_SN;
780
- }
781
- if (islabel(parser->token))
782
- {
783
- if (k=STRPUSH(m,parser->token)) return k;
784
-
785
- // on cr�e le bloc champ
786
- int* newfield=MALLOCCLEAR(m,REF_LENGTH);
787
- if (!newfield) return MTLERR_OM;
788
- TABSET(m,newfield,REF_NAME,STACKPULL(m));
789
- TABSET(m,newfield,REF_CODE,INTTOVAL(CODE_FIELD));
790
- if (k=STACKPUSH(m,PNTTOVAL(newfield))) return MTLERR_OM; // [newfield local name]
791
- addreftopackage(newfield,newpackage);
792
- STACKDROP(m);
793
- // [local name]
794
- if (k=STACKPUSH(m,TABGET(newref,REF_VAL))) return k;
795
- if (k=STACKPUSH(m,PNTTOVAL(newref))) return k;
796
- if (k=DEFTAB(m,FIELD_LENGTH)) return k;
797
- TABSET(m,newfield,REF_VAL,STACKPULL(m));
798
-
799
- TABSET(m,newref,REF_VAL,INTTOVAL(1+VALTOINT(TABGET(newref,REF_VAL)))); // incr�mentation
800
-
801
- if (k=createnodetype(TYPENAME_FUN)) return k;
802
- if (k=STACKPUSH(m,TABGET(newref,REF_TYPE))) return k;
803
- if (k=createnodetuple(1)) return k;
804
- TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0)); // attachement du noeud tuple au noeud fun
805
- STACKDROP(m);
806
-
807
- if ((!parser->next(0))||(strcmp(parser->token,":")))
808
- {
809
- parser->giveback();
810
- k=createnodetype(TYPENAME_WEAK);
811
- }
812
- else k=creategraph(parser,PNTTOVAL(newpackage),1,locals);
813
- if (k) return k;
814
- TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH+1,STACKGET(m,0)); // attachement du noeud resultat au noeud fun
815
- STACKDROP(m);
816
- TABSET(m,newfield,REF_TYPE,STACKPULL(m));
817
-
818
- outputbuf->reinit();
819
- outputbuf->printf("Compiler : %s : ",STRSTART(VALTOPNT(TABGET(newfield,REF_NAME))));
820
- echograph(outputbuf,VALTOPNT(TABGET(newfield,REF_TYPE)));
821
- PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
822
- }
823
- else if (!strcmp(parser->token,"]")) loop=0;
824
- else
825
- {
826
- PRINTF(m)(LOG_COMPILER,"Compiler : field name or ']' expected (found '%s')\n",parser->token);
827
- return MTLERR_SN;
828
- }
829
- } while(loop);
830
- if (k=parser->parsekeyword(";;")) return k;
831
-
832
- STACKDROPN(m,2);
833
-
834
- outputbuf->reinit();
835
- outputbuf->printf("Compiler : ");
836
- echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
837
- outputbuf->printf(" : struct (%d)\n",VALTOINT(TABGET(newref,REF_VAL)));
838
- PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
839
-
840
- return 0;
841
- }
842
-
843
- // compilation d'une somme
844
- // [locals nom]
845
- int Compiler::parsesum()
846
- {
847
- int k;
848
-
849
- // on cr�e le bloc type
850
- TABSET(m,newref,REF_VAL,INTTOVAL(0));
851
- TABSET(m,newref,REF_CODE,INTTOVAL(CODE_SUM));
852
- // [local name]
853
-
854
- int loop=1;
855
- do
856
- {
857
- if (!parser->next(0))
858
- {
859
- PRINTF(m)(LOG_COMPILER,"Compiler : constructor expected (found EOF)\n");
860
- return MTLERR_SN;
861
- }
862
- if (islabel(parser->token))
863
- {
864
- if (k=STRPUSH(m,parser->token)) return k;
865
-
866
- // on cr�e le bloc champ
867
- int* newcons=MALLOCCLEAR(m,REF_LENGTH);
868
- if (!newcons) return MTLERR_OM;
869
- TABSET(m,newcons,REF_NAME,STACKPULL(m));
870
- if (k=STACKPUSH(m,PNTTOVAL(newcons))) return MTLERR_OM; // [newcons local name]
871
- addreftopackage(newcons,newpackage);
872
- STACKDROP(m);
873
- // [local name]
874
- TABSET(m,newcons,REF_VAL,TABGET(newref,REF_VAL));
875
- TABSET(m,newref,REF_VAL,INTTOVAL(1+VALTOINT(TABGET(newref,REF_VAL)))); // incr�mentation
876
-
877
- if (k=createnodetype(TYPENAME_FUN)) return k;
878
-
879
- if ((parser->next(0))&&((!strcmp(parser->token,"|"))||(!strcmp(parser->token,";;"))))
880
- {
881
- parser->giveback();
882
- if (k=createnodetuple(0)) return k;
883
- TABSET(m,newcons,REF_CODE,INTTOVAL(CODE_CONS0));
884
- }
885
- else
886
- {
887
- parser->giveback();
888
- if (k=creategraph(parser,PNTTOVAL(newpackage),1,locals)) return k;
889
- if (k=createnodetuple(1)) return k;
890
- TABSET(m,newcons,REF_CODE,INTTOVAL(CODE_CONS));
891
- }
892
- TABSET(m,VALTOPNT(STACKGET(m,1)),TYPEHEADER_LENGTH,STACKGET(m,0)); // attachement du noeud tuple au noeud fun
893
- STACKDROP(m);
894
- TABSET(m,VALTOPNT(STACKGET(m,0)),TYPEHEADER_LENGTH+1,TABGET(newref,REF_TYPE)); // attachement du type resultat au noeud fun
895
- TABSET(m,newcons,REF_TYPE,STACKPULL(m));
896
-
897
- outputbuf->reinit();
898
- outputbuf->printf("Compiler : %s : ",STRSTART(VALTOPNT(TABGET(newcons,REF_NAME))));
899
- echograph(outputbuf,VALTOPNT(TABGET(newcons,REF_TYPE)));
900
- PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
901
- }
902
- else
903
- {
904
- PRINTF(m)(LOG_COMPILER,"Compiler : constructor expected (found '%s')\n",parser->token);
905
- return MTLERR_SN;
906
- }
907
-
908
- if (!parser->next(0))
909
- {
910
- PRINTF(m)(LOG_COMPILER,"Compiler : '|' or ';;' expected (found EOF)\n");
911
- return MTLERR_SN;
912
- }
913
- if (!strcmp(parser->token,";;")) loop=0;
914
- else if (strcmp(parser->token,"|"))
915
- {
916
- PRINTF(m)(LOG_COMPILER,"Compiler : '|' or ';;' expected (found '%s')\n",parser->token);
917
- return MTLERR_SN;
918
- }
919
- } while(loop);
920
- STACKDROPN(m,2);
921
-
922
- outputbuf->reinit();
923
- outputbuf->printf("Compiler : ");
924
- echograph(outputbuf,VALTOPNT(TABGET(newref,REF_TYPE)));
925
- outputbuf->printf(" : constructor\n");
926
- PRINTF(m)(LOG_COMPILER,"%s\n",outputbuf->getstart());
927
-
928
- return 0;
929
- }