nabaztag_hack_kit 0.1.0.beta3 → 0.1.0.beta8

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.
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
- }