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.
- checksums.yaml +7 -0
- data/.gitignore +7 -2
- data/.gitmodules +3 -0
- data/.travis.yml +2 -2
- data/CHANGELOG.md +17 -2
- data/LICENSE +21 -0
- data/README.md +115 -44
- data/Rakefile +2 -6
- data/bytecode/{Commands.md → _docs/commands.md} +0 -0
- data/bytecode/{Docs.md → _docs/grammar.md} +0 -0
- data/bytecode/_docs/grammar.pdf +0 -0
- data/bytecode/{src → _original}/README.md +0 -0
- data/bytecode/{src → _original}/lib/arp.mtl +0 -0
- data/bytecode/{src → _original}/lib/cfg.mtl +0 -0
- data/bytecode/{src → _original}/lib/choreos.mtl +0 -0
- data/bytecode/{src → _original}/lib/dhcp.mtl +0 -0
- data/bytecode/{src → _original}/lib/dns.mtl +0 -0
- data/bytecode/{src → _original}/lib/http.mtl +0 -0
- data/bytecode/{src → _original}/lib/tcp.mtl +0 -0
- data/bytecode/{src → _original}/lib/udp.mtl +0 -0
- data/bytecode/{src → _original}/lib/util.mtl +0 -0
- data/bytecode/{src → _original}/lib/var.mtl +0 -0
- data/bytecode/{src → _original}/lib/wav.mtl +0 -0
- data/bytecode/{src → _original}/lib/wifi.mtl +0 -0
- data/bytecode/{src → _original}/nominal-ping.mtl +0 -0
- data/bytecode/main.mtl +11 -11
- data/bytecode/test/test.mtl +8 -8
- data/examples/basic/Gemfile +1 -3
- data/examples/basic/config.ru +14 -4
- data/examples/record/Gemfile +0 -5
- data/examples/record/{config.ru.example → config.ru} +2 -2
- data/examples/record/server.rb +0 -2
- data/ext/Makefile +10 -0
- data/ext/bin/mtl_comp +29 -0
- data/{bytecode → ext}/bin/mtl_merge +0 -0
- data/ext/bin/mtl_simu +29 -0
- data/{bytecode/src/mtl → ext}/extconf.rb +0 -0
- data/ext/mtl_linux/.gitignore +7 -0
- data/ext/mtl_linux/LICENSE +21 -0
- data/ext/mtl_linux/Makefile +116 -0
- data/ext/mtl_linux/MetalC.project +196 -0
- data/ext/mtl_linux/conf.bin +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux}/conf.bin.sans_password +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux}/config.txt +0 -0
- data/ext/mtl_linux/inc/log.h +21 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/properties.h +0 -0
- data/{bytecode/src/mtl/linux_simuaudio.h → ext/mtl_linux/inc/simu/linux/simuaudio.h} +0 -0
- data/{bytecode/src/mtl/linux_simunet.h → ext/mtl_linux/inc/simu/linux/simunet.h} +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/simu/win}/simuaudio.h +18 -18
- data/{bytecode/src/mtl → ext/mtl_linux/inc/simu/win}/simunet.h +0 -0
- data/ext/mtl_linux/inc/vcomp/compiler.h +200 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/file.h +11 -11
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/filesystem.h +0 -0
- data/ext/mtl_linux/inc/vcomp/interpreter.h +121 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/memory.h +120 -92
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/param.h +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/parser.h +27 -27
- data/ext/mtl_linux/inc/vcomp/prodbuffer.h +42 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/resource.h +1 -1
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/terminal.h +8 -8
- data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/util.h +7 -7
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vaudio.h +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vbc.h +1 -1
- data/ext/mtl_linux/inc/vm/vbc_str.h +167 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vinterp.h +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vloader.h +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vlog.h +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vmem.h +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vnet.h +0 -0
- data/ext/mtl_linux/nominal.mtl +3959 -0
- data/ext/mtl_linux/src/comp/main.cpp +123 -0
- data/ext/mtl_linux/src/simu/dumpbc.c +2566 -0
- data/ext/mtl_linux/src/simu/linux/main.cpp +288 -0
- data/ext/mtl_linux/src/simu/linux/simu.c +309 -0
- data/ext/mtl_linux/src/simu/linux/simuaudio.c +44 -0
- data/ext/mtl_linux/src/simu/linux/simunet.c +707 -0
- data/ext/mtl_linux/src/simu/log.c +340 -0
- data/ext/mtl_linux/src/simu/properties.c +368 -0
- data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/GTKANAL.H +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/LAYER3.C +0 -0
- data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/TABINIT.C +0 -0
- data/ext/mtl_linux/src/simu/win/mp3/common.c +302 -0
- data/ext/mtl_linux/src/simu/win/mp3/dct64_i386.c +316 -0
- data/ext/mtl_linux/src/simu/win/mp3/decode_i386.c +160 -0
- data/ext/mtl_linux/src/simu/win/mp3/huffman.h +332 -0
- data/ext/mtl_linux/src/simu/win/mp3/interface.c +276 -0
- data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/mpg123.h +34 -30
- data/ext/mtl_linux/src/simu/win/mp3/mpglib.h +47 -0
- data/ext/mtl_linux/src/simu/win/simu.c +819 -0
- data/ext/mtl_linux/src/simu/win/simuaudio.c +787 -0
- data/ext/mtl_linux/src/simu/win/simunet.c +489 -0
- data/ext/mtl_linux/src/vcomp/bootstrap.cpp +95 -0
- data/ext/mtl_linux/src/vcomp/compiler.cpp +587 -0
- data/ext/mtl_linux/src/vcomp/compiler_file.cpp +1253 -0
- data/ext/mtl_linux/src/vcomp/compiler_prog.cpp +437 -0
- data/ext/mtl_linux/src/vcomp/compiler_term.cpp +1500 -0
- data/ext/mtl_linux/src/vcomp/compiler_type.cpp +1238 -0
- data/ext/mtl_linux/src/vcomp/compiler_var.cpp +502 -0
- data/ext/mtl_linux/src/vcomp/file.cpp +100 -0
- data/ext/mtl_linux/src/vcomp/interpreter.cpp +93 -0
- data/ext/mtl_linux/src/vcomp/memory.cpp +313 -0
- data/ext/mtl_linux/src/vcomp/parser.cpp +584 -0
- data/ext/mtl_linux/src/vcomp/parser_xml.cpp +137 -0
- data/{bytecode/src/mtl → ext/mtl_linux/src}/vcomp/prodbuffer.cpp +57 -36
- data/ext/mtl_linux/src/vcomp/stdlib_core.cpp +130 -0
- data/ext/mtl_linux/src/vcomp/terminal.cpp +80 -0
- data/{bytecode/src/mtl → ext/mtl_linux/src}/vcomp/util.cpp +18 -11
- data/ext/mtl_linux/src/vm/vaudio.c +830 -0
- data/ext/mtl_linux/src/vm/vinterp.c +1780 -0
- data/ext/mtl_linux/src/vm/vloader.c +139 -0
- data/ext/mtl_linux/src/vm/vlog.c +782 -0
- data/ext/mtl_linux/src/vm/vmem.c +461 -0
- data/ext/mtl_linux/src/vm/vnet.c +298 -0
- data/{bytecode/src/mtl → ext/mtl_linux}/utils/correct_const.sh +0 -0
- data/lib/nabaztag_hack_kit/server.rb +4 -7
- data/lib/nabaztag_hack_kit/version.rb +1 -1
- data/lib/nabaztag_hack_kit.rb +2 -2
- data/nabaztag_hack_kit.gemspec +10 -11
- data/spec/integration/server_spec.rb +3 -3
- data/spec/spec_helper.rb +2 -0
- data/spec/unit/message_spec.rb +12 -18
- data/spec/unit/server_spec.rb +13 -10
- metadata +145 -137
- data/bytecode/bin/mtl_comp +0 -50
- data/bytecode/bin/mtl_simu +0 -49
- data/bytecode/src/mtl/Makefile +0 -42
- data/bytecode/src/mtl/README.md +0 -13
- data/bytecode/src/mtl/bc.cpp +0 -1891
- data/bytecode/src/mtl/dumpbc.c +0 -2566
- data/bytecode/src/mtl/linux_simu.c +0 -271
- data/bytecode/src/mtl/linux_simuaudio.c +0 -16
- data/bytecode/src/mtl/linux_simunet.c +0 -620
- data/bytecode/src/mtl/log.c +0 -297
- data/bytecode/src/mtl/log.h +0 -20
- data/bytecode/src/mtl/main_compiler.cpp +0 -104
- data/bytecode/src/mtl/main_simu.cpp +0 -221
- data/bytecode/src/mtl/mp3/common.c +0 -265
- data/bytecode/src/mtl/mp3/dct64_i386.c +0 -316
- data/bytecode/src/mtl/mp3/decode_i386.c +0 -155
- data/bytecode/src/mtl/mp3/huffman.h +0 -332
- data/bytecode/src/mtl/mp3/interface.c +0 -258
- data/bytecode/src/mtl/mp3/mpglib.h +0 -44
- data/bytecode/src/mtl/properties.c +0 -293
- data/bytecode/src/mtl/simu.c +0 -750
- data/bytecode/src/mtl/simuaudio.c +0 -662
- data/bytecode/src/mtl/simunet.c +0 -400
- data/bytecode/src/mtl/vaudio.c +0 -677
- data/bytecode/src/mtl/vbc_str.h +0 -166
- data/bytecode/src/mtl/vcomp/Makefile +0 -29
- data/bytecode/src/mtl/vcomp/bootstrap.cpp +0 -89
- data/bytecode/src/mtl/vcomp/compiler.cpp +0 -470
- data/bytecode/src/mtl/vcomp/compiler.h +0 -200
- data/bytecode/src/mtl/vcomp/compiler_file.cpp +0 -929
- data/bytecode/src/mtl/vcomp/compiler_prog.cpp +0 -250
- data/bytecode/src/mtl/vcomp/compiler_term.cpp +0 -1053
- data/bytecode/src/mtl/vcomp/compiler_type.cpp +0 -872
- data/bytecode/src/mtl/vcomp/compiler_var.cpp +0 -289
- data/bytecode/src/mtl/vcomp/file.cpp +0 -79
- data/bytecode/src/mtl/vcomp/interpreter.cpp +0 -85
- data/bytecode/src/mtl/vcomp/interpreter.h +0 -121
- data/bytecode/src/mtl/vcomp/memory.cpp +0 -241
- data/bytecode/src/mtl/vcomp/parser.cpp +0 -427
- data/bytecode/src/mtl/vcomp/parser_xml.cpp +0 -124
- data/bytecode/src/mtl/vcomp/prodbuffer.h +0 -42
- data/bytecode/src/mtl/vcomp/stdlib_core.cpp +0 -122
- data/bytecode/src/mtl/vcomp/terminal.cpp +0 -73
- data/bytecode/src/mtl/vinterp.c +0 -1349
- data/bytecode/src/mtl/vloader.c +0 -127
- data/bytecode/src/mtl/vlog.c +0 -589
- data/bytecode/src/mtl/vmem.c +0 -424
- data/bytecode/src/mtl/vnet.c +0 -255
- data/examples/basic/Procfile +0 -2
- 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
|
-
}
|