このファイル: /home/web6047/www/cgi-bin/prj/20180728-javascript/callbackを使った例(合理anmからcallback)+batch/batch.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function debugprint_recursive( object, indent ) {
30
31
if( indent == null ) indent = "";
32
33
console.log( "DEC[" + object.declaration + "]\tINST[" + object.instruction + "]\tARG[" + object.argtext + "]" );
34
for( var i = 0; i < object.children.length; i++ ) {
35
indent += "\t";
36
debugprint_recursive( object.children[ i ], indent );
37
indent = indent.substr( 0, indent.length - 1 );
38
}
39
}
40
41
42
43
function Instruction( declaration, instruction, argtext, blocktext, comment ) {
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
this.declaration = declaration;
67
this.instruction = instruction;
68
this.argtext = argtext;
69
this.blocktext = blocktext;
70
this.comment = comment;
71
72
this.children = new Array();
73
74
75
if( this.blocktext != null ) this.analyze( this.blocktext );
76
77
}
78
Instruction.prototype.exec = function() {
79
var envs = new Array();
80
var env = {
81
object : this,
82
counter : 0,
83
next : null,
84
parentEnv : null,
85
intoBlk : true,
86
};
87
88
owner = this;
89
90
var func = function() {
91
92
93
loop1: while( 1 ) {
94
95
if( ! env.object.commentProcessed && env.object.comment && env.object.comment.match( /anm(\d+)/ ) ) {
96
env.object.commentProcessed = true;
97
var ms = Number( RegExp.$1 );
98
setTimeout( func, ms );
99
break loop1;
100
}
101
else if( ! env.object.commentProcessed && env.object.comment && env.object.comment.match( /suspend/ ) ) {
102
env.object.commentProcessed = true;
103
owner.resume = func;
104
break loop1;
105
}
106
107
env.object.commentProcessed = false;
108
109
110
switch( env.object.instruction ) {
111
112
case "if":
113
env.intoBlk = eval( env.object.argtext );
114
115
if( env.next && env.next.instruction == "else" ) {
116
env.next.elseCancel = env.intoBlk;
117
}
118
break;
119
case "else":
120
break;
121
122
case "for":
123
if( typeof env.forInit === "undefined" ) {
124
if( env.object.argtext.match( /(.*);(.*);(.*)/ ) ) {
125
env.forInit = RegExp.$1;
126
env.forCond = RegExp.$2;
127
env.forAdd = RegExp.$3;
128
} else {
129
console.log( "syntax erro on for: " + env.object.argtext );
130
}
131
env.forInit = env.forInit.replace( /var\s+/, "env." );
132
eval( env.forInit );
133
} else {
134
with( env ) eval( env.forAdd );
135
}
136
with( env ) env.intoBlk = eval( env.forCond );
137
break;
138
139
default:
140
var script = "";
141
if( env.object.declaration == "function" ) {
142
script += "env.parentEnv.";
143
script += env.object.instruction + " = function( ";
144
script += env.object.argtext + " ) { ";
145
script += env.object.blocktext + " }";
146
env.intoBlk = false;
147
} else if( env.object.declaration == "var" ) {
148
script += "env.";
149
script += env.object.instruction;
150
env.intoBlk = false;
151
} else if( env.object.instruction != null ) {
152
script += env.object.instruction;
153
if( env.object.argtext != null ) script += "(" + env.object.argtext + ")";
154
if( env.object.blocktext != null ) script += "{" + env.object.blocktext + "}";
155
} else {
156
157
break;
158
}
159
160
161
var allWith = "";
162
for( var j = 1; j < envs.length - 1; j++ ) {
163
allWith += "with( envs[ " + j + " ] ) ";
164
}
165
if( env.parentEnv ) allWith += "with( env.parentEnv ) ";
166
167
eval( allWith + script );
168
}
169
170
171
while( env.object.elseCancel || ! env.intoBlk || env.counter == env.object.children.length ) {
172
173
if( envs.length == 0 ) break loop1;
174
175
if( env.object.instruction == "for" && env.intoBlk ) {
176
env.counter = 0;
177
continue loop1;
178
}
179
180
181
env = envs.pop();
182
}
183
184
185
envs.push( env );
186
env = {
187
object : env.object.children[ env.counter++ ],
188
next : env.object.children[ env.counter ],
189
counter : 0,
190
intoBlk : true,
191
parentEnv : env,
192
}
193
194
}
195
196
};
197
198
199
func();
200
201
};
202
Instruction.prototype.analyze = function( text ) {
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
text = text.replace( /^\t+/mg, " " );
219
text = text.replace( /\n/g, ";" );
220
221
222
223
224
var res = escapeBrackets( text, "{", "}", "_block_#_;", true );
225
var blocks = res.contents;
226
227
var res = escapeBrackets( res.text, "(", ")", "_kakko_#_" );
228
var kakkos = res.contents;
229
230
231
var text2 = res.text;
232
text2 = text2.replace( /;\s+/mg, ";" );
233
text2 = text2.replace( /^\s+/gm, "" );
234
235
236
237
var lines = text2.split( /;/ );
238
for( var i = 0; i < lines.length; i++ ) {
239
var line = lines[ i ];
240
241
if( line.match( /^\s*$/ ) ) continue;
242
243
244
var declaration = null;
245
var instruction = null;
246
var argtext = null;
247
var blocktext = null;
248
var comment = null;
249
var tp = null;
250
251
252
if( line.match( /\/\// ) ) {
253
line = RegExp.leftContext;
254
comment = RegExp.rightContext;
255
comment = comment.replace( /^\s+|\s+$/g, "" );
256
}
257
258
259
if( line.match( /(var\s+|)(.+=.+?)\((.*)\)/ ) ) {
260
261
tp = 1.5;
262
declaration = RegExp.$1;
263
instruction = RegExp.$2;
264
argtext = RegExp.$3;
265
266
} else if( line.match( /(var\s+|)(.+=.+)/ ) ) {
267
268
tp = 1;
269
declaration = RegExp.$1;
270
instruction = RegExp.$2;
271
272
273
} else if( line.match( /(var\s+)(.+)/ ) ) {
274
275
tp = 2;
276
declaration = RegExp.$1;
277
instruction = RegExp.$2;
278
279
} else if( line.match( /(function\s+|)(.+)\((.*)\)(.+)/ ) ) {
280
281
tp = 3;
282
declaration = RegExp.$1;
283
instruction = RegExp.$2;
284
argtext = RegExp.$3;
285
blocktext = RegExp.$4;
286
287
} else if( line.match( /(.+)\((.*)\)/ ) ) {
288
289
tp = 4;
290
instruction = RegExp.$1;
291
argtext = RegExp.$2;
292
293
} else if( line.match( /(.*)\s(.*)/ ) ) {
294
295
tp = 5;
296
instruction = RegExp.$1;
297
blocktext = RegExp.$2;
298
299
} else if( comment != null ) {
300
301
} else {
302
303
console.log( "syntax error: " + ": [" + line + "]" );
304
continue;
305
306
}
307
308
309
if( argtext != null && argtext.match( /_kakko_(\d+)_/ ) ) {
310
argtext = kakkos[ RegExp.$1 ];
311
}
312
313
if( blocktext != null ) {
314
315
316
while( blocktext.match( /_kakko_(\d+)_/ ) ) {
317
blocktext = RegExp.leftContext + kakkos[ RegExp.$1 ] + RegExp.rightContext;
318
}
319
320
if( blocktext.match( /_block_(\d+)_/ ) ) {
321
blocktext = blocks[ RegExp.$1 ];
322
}
323
}
324
325
326
if( declaration != null ) declaration = declaration.replace( /^\s+|\s+$/, "" );
327
328
329
this.children.push( new Instruction( declaration, instruction, argtext, blocktext, comment ) );
330
331
}
332
}
333
function escapeBrackets( text, startBracket, endBracket, identifier, swDelBracket ) {
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
var res = {
369
text : "",
370
contents : new Array()
371
};
372
373
var level = 0;
374
var buffer = "";
375
var tail = text;
376
var bracketSearchKey = "[" + startBracket + endBracket + "]";
377
378
while( tail.match( bracketSearchKey ) ) {
379
var bracket = RegExp.lastMatch;
380
var left = RegExp.leftContext;
381
tail = RegExp.rightContext;
382
383
384
if( level > 0 )
385
buffer += left;
386
else
387
res.text += left;
388
389
390
if( bracket == endBracket ) {
391
level --;
392
393
if( level == 0 ) {
394
var id = identifier.replace( "#", res.contents.length );
395
res.text += id;
396
res.contents.push( buffer );
397
buffer = "";
398
}
399
}
400
401
402
403
if( level > 0 )
404
buffer += bracket;
405
else if( ! swDelBracket )
406
res.text += bracket;
407
408
409
if( bracket == startBracket ) {
410
level ++;
411
}
412
}
413
res.text += tail;
414
415
return res;
416
}