Subversion Repositories Kolibri OS

Rev

Rev 7745 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7745 Rev 7844
Line 1... Line 1...
1
/*
1
/*
2
 * Author Pavel Iakovlev
2
 * Author Pavel Iakovlev by PaulCodeman
3
*/
3
*/
Line 4... Line 4...
4
 
4
 
Line 5... Line 5...
5
#define MEMSIZE 4096*10
5
#define MEMSIZE 4096*10
6
 
6
 
7
#include "../lib/io.h"
-
 
Line 8... Line 7...
8
#include "../lib/obj/console.h"
7
#include "../lib/io.h"
9
#include "../lib/array.h"
-
 
10
 
8
#include "../lib/obj/console.h"
11
byte initConsole = 0;
-
 
12
Dictionary functions = {0};
9
 
13
Dictionary variables = {0};
-
 
14
 
10
#define TString 1
15
#include "stdcall.h"
11
#define TSymbol 2
16
 
12
#define TNumber 3
17
#define bufferSize 10000;
13
#define TList   4
Line 18... Line -...
18
#define memoryBrainfuck 30000*4
-
 
19
#define memoryByteBF 1
-
 
20
#define stackBrainFuck 4*1024
-
 
21
 
-
 
22
#define TStr 1
-
 
23
#define TInt 2
14
#define Proc    5
Line -... Line 15...
-
 
15
#define Lambda  6
-
 
16
#define TObject 7
24
#define TSym 3
17
 
25
#define TBol 4
18
#define sizeStruct 4*4
26
 
19
 
27
#define TLen 4*5
-
 
28
 
20
byte initConsole = 0;
29
dword buffer = 0;
21
dword maxLoop = 100;
30
word bufferSymbol = 0;
22
dword buffer = 0;
Line 31... Line 23...
31
dword memory = 0;
23
dword bufferSize = 1000;
32
 
24
dword variable = 0;
33
dword stack = 0;
25
dword key = 0;
34
dword code = 0;
26
dword treeItem = 0;
Line 42... Line 34...
42
		con_init stdcall (-1, -1, -1, -1, "Lisp interpreter");
34
		con_init stdcall (-1, -1, -1, -1, "Lisp interpreter");
43
		initConsole = 0xFF;
35
		initConsole = 0xFF;
44
	}
36
	}
45
}
37
}
Line -... Line 38...
-
 
38
 
-
 
39
dword error_message(dword text)
-
 
40
{
-
 
41
	con_printf stdcall (text);
-
 
42
	ExitProcess();
-
 
43
}
46
 
44
 
-
 
45
dword crc32Table = 0;
47
dword evalLisp()
46
dword makeCRCTable(void)
48
{
-
 
49
	byte s = 0;
-
 
50
	byte args = 0;
-
 
51
	dword pos = 0;
-
 
52
	dword name = 0;
-
 
53
	dword tmp = 0;
-
 
54
	dword tmp2 = 0;
-
 
55
	dword dataArgs = 0;
-
 
56
	dword posArgs = 0;
-
 
57
	dword ret = 0;
-
 
58
	dword p = 0;
47
{
-
 
48
	dword i = 0;
59
	dword i = 0;
49
	dword c = 0;
-
 
50
	dword ii = 0;
-
 
51
	dword crcTable = 0;
60
	dword ii = 0;
52
	IF (crc32Table) RETURN 0;
61
	dataArgs = malloc(16*4);
53
	crc32Table = malloc(4*256);
62
	posArgs = dataArgs;
-
 
63
 
54
	crcTable = crc32Table;
64
	loop()
55
	WHILE (i < 256)
65
	{
56
	{
-
 
57
		c = i;
66
		s = DSBYTE[code];
58
		ii = 0;
67
		while (s == ' ') || (s == 9) || (s == 10) || (s == 13)
59
		WHILE (ii < 8)
-
 
60
		{
-
 
61
			IF (c&1)
-
 
62
			{
-
 
63
				c >>= 1;
-
 
64
				c ^= 0xEDB88320;
-
 
65
			}
68
		{
66
			ELSE c >>= 1;
-
 
67
			ii++;
69
			code++;
68
		}
-
 
69
		DSDWORD[crcTable] = c;
-
 
70
		crcTable += 4;
70
			s = DSBYTE[code];
71
		i++;
-
 
72
	}
71
		}
73
}
72
		if (!s) return 0;
-
 
73
		if (s==')') 
74
dword crc32(dword bytes)
74
		{
75
{
75
			code++;
76
	dword crc = 0;
76
			args--;
77
	byte b = 0;
-
 
78
	IF (!crc32Table) makeCRCTable();
-
 
79
	crc = 0xFFFFFFFF;
-
 
80
	WHILE (DSBYTE[bytes])
-
 
81
	{
-
 
82
		b = DSBYTE[bytes];
-
 
83
		bytes++;
77
			ret = StdCall(args, name, dataArgs);
84
		EDX = crc^b;
-
 
85
		EDX &= 0xFF;
78
			free(name);
86
		EDX <<= 2;
79
			//free(dataArgs);
87
		EDX += crc32Table;
-
 
88
		crc >>= 8;
-
 
89
		crc ^= DSDWORD[EDX];
-
 
90
	}
80
			return ret;
91
	RETURN crc ^ 0xFFFFFFFF;
-
 
92
}
81
		}
93
 
82
		if(s == '(') 
94
dword indexArray(dword address, key)
83
		{
95
{
84
			code++;
96
	dword offset = key&11b;
85
			DSDWORD[posArgs] = evalLisp();
97
	dword offsetAddress = offset*4+address;
86
			args++;
98
	IF (key==offset) RETURN 4*4+offsetAddress;
87
			posArgs += 4;
99
	IF (!DSDWORD[offsetAddress]) DSDWORD[offsetAddress] = malloc(4*4*2);
88
			continue;
100
	RETURN indexArray(DSDWORD[offsetAddress], key>>2);
-
 
101
}
89
		}
102
 
90
		else if (!args) 
103
void set_procedure(dword name, address)
-
 
104
{
91
		{
105
	dword data = 0;
-
 
106
	data = malloc(sizeStruct);
-
 
107
	DSDWORD[data] = Proc;
-
 
108
	DSDWORD[data+4] = address;
-
 
109
	indexArray(variable, crc32(name));
-
 
110
	DSDWORD[EAX] = data;
-
 
111
}
-
 
112
 
92
			if (s != ')') // name function
113
void set_variable(dword name, data)
93
			{
114
{
94
				name = malloc(100);
115
	indexArray(variable, crc32(name));
-
 
116
	DSDWORD[EAX] = data;
-
 
117
}
95
				pos = name;
118
 
96
				while (s) && (s != ' ') && (s != ')')
119
dword string(dword lisp)
-
 
120
{
97
				{
121
	dword buffer = 0;
98
					DSBYTE[pos] = s;
122
	if (DSDWORD[lisp] == TList)
-
 
123
	{
99
					pos++;
124
		
100
					code++;
-
 
101
					s = DSBYTE[code];
125
		return "";
-
 
126
	}
-
 
127
	switch (DSDWORD[lisp])
-
 
128
	{
-
 
129
		case TString:
-
 
130
		case TSymbol:
-
 
131
			return DSDWORD[lisp+4];
-
 
132
		case TNumber:
-
 
133
			
-
 
134
			return itoa(DSDWORD[lisp+4]);
102
				}	
135
		case Lambda:
103
				DSBYTE[pos] = 0;
136
			return "[LAMBDA]";
-
 
137
		case Proc:
-
 
138
			return "[PROC]";
-
 
139
		case TObject:
104
				args++;
140
			return "[OBJECT]";
-
 
141
		case TList:
105
				continue;
142
			return "[LIST]";
106
			}
143
	}
107
		}
144
}
-
 
145
 
108
		else
146
dword number(dword lisp)
109
		{
147
{
110
			if (s >= '0') && (s <= '9')
148
	if (DSDWORD[lisp] == TNumber)
111
			{
149
	{
-
 
150
		return DSDWORD[lisp+4];
112
				tmp = 0;
151
	}
113
				while (s >= '0') && (s <= '9')
152
	if (DSDWORD[lisp] == TString)
114
				{
-
 
115
					tmp *= 10;
-
 
116
					tmp += s-'0';
-
 
117
					code++;
153
	{
118
					s = DSBYTE[code];
154
		//return atoi(DSDWORD[lisp+4]);
119
				}
155
	}
120
				args++;
-
 
121
				EDX = malloc(TLen);
-
 
122
				DSDWORD[EDX] = tmp;
-
 
123
				DSDWORD[EDX+4] = TInt;
-
 
124
				DSDWORD[posArgs] = EDX;
-
 
125
				posArgs += 4;
-
 
126
				continue;
156
	return 0;
-
 
157
}
-
 
158
 
-
 
159
dword lexer(dword code)
-
 
160
{
-
 
161
	byte s = 0;
127
			}
162
	dword alloc = 0;
-
 
163
	dword buffer = 0;
-
 
164
	dword position = 0;
-
 
165
	dword key = 0;
-
 
166
	alloc = malloc(32);
-
 
167
	//con_printf stdcall(code);
128
			else if (s == '"')
168
	while(DSBYTE[code])
129
			{
-
 
130
				i = 1;
169
	{
131
				tmp = malloc(1<
-
 
132
				p = tmp;
170
		s = DSBYTE[code];
-
 
171
		code++;
-
 
172
		if (s == ' ') || (s == '\n') || (s == '\t') || (s == '\r') continue;
-
 
173
		if (s == '(') || (s == ')')
-
 
174
		{
-
 
175
			buffer = malloc(2);
-
 
176
			DSBYTE[buffer] = s;
-
 
177
			indexArray(alloc, key);
-
 
178
			DSDWORD[EAX] = buffer;
-
 
179
			key++;
-
 
180
			continue;
-
 
181
		}
-
 
182
		buffer = malloc(25);
-
 
183
		position = buffer;
-
 
184
		DSBYTE[position] = s;
-
 
185
		if (s == '"')
-
 
186
		{
-
 
187
			while(DSBYTE[code])
133
				code++;
188
			{
134
				s = DSBYTE[code];
189
				s = DSBYTE[code];
135
				ii = 0;
190
				position++;
-
 
191
				DSBYTE[position] = s;
-
 
192
				code++;
-
 
193
				if (s == '"') && (DSBYTE[code-2] != '\\') break;
-
 
194
			}
-
 
195
		}
136
				while (s != '"') && (s)
196
		else
-
 
197
		{
-
 
198
			while(DSBYTE[code])
-
 
199
			{
-
 
200
				s = DSBYTE[code];
-
 
201
				if (s == ' ') || (s == '\n') || (s == '\t') || (s == '\r') || (s == '(') || (s == ')') break;
-
 
202
				position++;
137
				{
203
				DSBYTE[position] = s;
-
 
204
				code++;
-
 
205
			}
-
 
206
		}
-
 
207
		indexArray(alloc, key);
-
 
208
		DSDWORD[EAX] = buffer;
-
 
209
		key++;
-
 
210
	}
138
					ii++;
211
	indexArray(alloc, key);
-
 
212
	DSDWORD[EAX] = 0;
-
 
213
	/*key = 0;
-
 
214
	do {
-
 
215
	buffer = indexArray(alloc, key);
-
 
216
	if (!DSDWORD[buffer]) break;
-
 
217
	con_printf stdcall ("\r\n");
-
 
218
	con_printf stdcall (DSDWORD[buffer]);key++;
-
 
219
	} while(1);*/
-
 
220
	return alloc;
-
 
221
}
-
 
222
 
-
 
223
 
139
					if (1<
224
dword tree(dword alloc)
-
 
225
{
-
 
226
	dword token = 0;
-
 
227
	dword list = 0;
-
 
228
	dword buffer = 0;
-
 
229
	dword temp = 0;
-
 
230
	dword listBuffer = 0;
-
 
231
	dword i = 0;
-
 
232
	token = indexArray(alloc, treeItem);
-
 
233
	treeItem++;
-
 
234
	buffer = DSDWORD[token];
-
 
235
 
-
 
236
	if (DSBYTE[buffer] == '(')
-
 
237
	{
-
 
238
		list = malloc(32);
-
 
239
		while(1) {
-
 
240
			token = indexArray(alloc, treeItem);
-
 
241
			token = DSDWORD[token];
-
 
242
			if (!token) || (DSBYTE[token] == ')') break;
-
 
243
			buffer = indexArray(list, i);
140
					{
244
			DSDWORD[buffer] = tree(alloc);
141
						i++;
-
 
142
						tmp2 = p-tmp;
-
 
143
						tmp = realloc(tmp, 1<
-
 
144
						p = tmp+tmp2;
245
			i++;
-
 
246
		}
-
 
247
		treeItem++;
145
					}
248
		indexArray(list, i);
-
 
249
		DSDWORD[EAX] = 0;
-
 
250
		malloc(sizeStruct);
-
 
251
		DSDWORD[EAX] = TList;
146
					DSBYTE[p] = s;
252
		DSDWORD[EAX+4] = list;
-
 
253
		return EAX;
-
 
254
	}
-
 
255
	return atom(DSDWORD[token]);
Line -... Line 256...
-
 
256
}
-
 
257
 
147
					p++;
258
dword hexdec2(dword buffer, length)
148
					
259
{
-
 
260
	dword r = 0;
-
 
261
	length += buffer;
-
 
262
	while (length != buffer)
-
 
263
	{
-
 
264
		length--;
-
 
265
		r <<= 4;
-
 
266
		if (DSBYTE[length] >= 'A') && (DSBYTE[length] <= 'F') r |= DSBYTE[length]-'A'+10;
149
					code++;
267
		else if (DSBYTE[length] >= 'a') && (DSBYTE[length] <= 'f') r |= DSBYTE[length]-'a'+10;
150
					s = DSBYTE[code];
-
 
151
				}
-
 
152
				DSBYTE[p] = 0;
-
 
153
				EDX = malloc(TLen);
-
 
154
				DSDWORD[EDX] = tmp;
-
 
155
				DSDWORD[EDX+4] = TStr;
-
 
156
				DSDWORD[EDX+8] = p-tmp;
-
 
157
				DSDWORD[posArgs] = EDX;
-
 
158
				posArgs += 4;
268
		else if (DSBYTE[length] >= '0') && (DSBYTE[length] <= '9') r |= '9'-DSBYTE[length];
159
				code++;
-
 
160
				args++;
269
	}
161
				continue;
270
	return r;
-
 
271
}
162
			}
272
 
163
			else
273
dword atom(dword token)
164
			{
274
{
-
 
275
	dword buffer = 0;
165
				tmp = malloc(20);
276
	dword pos = 0;
166
				p = tmp;
277
	dword data = 0;
167
				while (s) && (s != ')') && (s != '(') && (s != ' ') && (s != 10) && (s != 13)
278
	if (DSBYTE[token] == '-') && (DSBYTE[token+1] >= '0') && (DSBYTE[token+1] <= '9')
168
				{
279
	{
169
					DSBYTE[p] = s;
280
		malloc(sizeStruct);
170
					p++;
281
		DSDWORD[EAX] = TNumber;
171
					code++;
282
		DSDWORD[EAX+4] = atoi(token);
172
					s = DSBYTE[code];
283
		return EAX;
173
				}
284
	}
174
				DSBYTE[p] = 0;
285
	if (DSBYTE[token] >= '0') && (DSBYTE[token] <= '9')
175
				args++;
286
	{
176
				EDX = malloc(TLen);
287
		while (DSBYTE[token]) && (DSBYTE[token] >= '0') && (DSBYTE[token] <= '9')
177
				DSDWORD[EDX] = tmp;
288
		{
178
				DSDWORD[EDX+4] = TSym;
-
 
179
				DSDWORD[posArgs] = EDX;
289
			data *= 10;
180
				posArgs += 4;
290
			data += DSBYTE[token]-'0';
Line -... Line 291...
-
 
291
			token++;
-
 
292
		}
181
				continue;
293
 
182
			}
294
		malloc(sizeStruct);
183
			
295
		DSDWORD[EAX] = TNumber;
-
 
296
		DSDWORD[EAX+4] = data;
-
 
297
		return EAX;
-
 
298
	}
-
 
299
	if (DSBYTE[token] == '"')
184
			DSDWORD[posArgs] = tmp;
300
	{	
-
 
301
		pos = token;
-
 
302
		buffer = token;
-
 
303
		pos++;
-
 
304
		while (DSBYTE[pos]) && (DSBYTE[pos] != '"')
-
 
305
		{
-
 
306
			if (DSBYTE[pos] == '\\')
-
 
307
			{
-
 
308
				pos++;
-
 
309
				switch (DSBYTE[pos])
-
 
310
				{
-
 
311
					case 'n': DSBYTE[buffer] = 13; break; 
-
 
312
					case 'r': DSBYTE[buffer] = 10; break; 
-
 
313
					case 't': DSBYTE[buffer] = 9;  break; 
-
 
314
					case 'x':
-
 
315
						pos++;
-
 
316
						DSBYTE[buffer] = hexdec2(pos, 2);
-
 
317
						pos++;
-
 
318
					break; 
-
 
319
					default:
-
 
320
						DSBYTE[buffer] = DSBYTE[pos];
-
 
321
				}
185
			posArgs += 4;
322
			}
-
 
323
			else DSBYTE[buffer] = DSBYTE[pos];
-
 
324
			buffer++;
-
 
325
			pos++;
-
 
326
		}
-
 
327
		DSBYTE[buffer] = 0;
-
 
328
		malloc(sizeStruct);
-
 
329
		DSDWORD[EAX] = TString;
-
 
330
		DSDWORD[EAX+4] = token;
-
 
331
		DSDWORD[EAX+8] = token-buffer;
-
 
332
		return EAX;
-
 
333
	}
-
 
334
	pos = token;
-
 
335
	while (DSBYTE[pos])
-
 
336
	{
-
 
337
		if (DSBYTE[pos] >= 'a') && (DSBYTE[pos] <= 'z') DSBYTE[pos] = DSBYTE[pos]-'a'+'A';
-
 
338
		pos++;
-
 
339
	}
-
 
340
	malloc(sizeStruct);
-
 
341
	DSDWORD[EAX] = TSymbol;
-
 
342
	DSDWORD[EAX+4] = token;
-
 
343
	return EAX;
-
 
344
}
-
 
345
 
-
 
346
dword lisp(dword tree)
-
 
347
{
-
 
348
	dword buffer = 0;
-
 
349
	dword list = 0;
-
 
350
	dword args = 0;
-
 
351
	dword key = 0;
-
 
352
	dword item = 0;
-
 
353
 
-
 
354
	switch (DSDWORD[tree])
-
 
355
	{
-
 
356
		case TSymbol:
-
 
357
			buffer = indexArray(variable, crc32(DSDWORD[tree+4]));
-
 
358
			IF (!DSDWORD[buffer]) return tree;
-
 
359
			return DSDWORD[buffer];
-
 
360
		case TNumber:
-
 
361
		case TString:
-
 
362
			return tree;	
-
 
363
		case TList:
-
 
364
			list = DSDWORD[tree+4];
-
 
365
			buffer = indexArray(list, 0);
-
 
366
			if (!buffer) {
-
 
367
				malloc(sizeStruct);
-
 
368
				DSDWORD[buffer] = TSymbol;
-
 
369
				DSDWORD[buffer+4] = NIL;
-
 
370
				return buffer;
-
 
371
			}
-
 
372
			
-
 
373
			buffer = DSDWORD[buffer];
-
 
374
			if (DSDWORD[buffer] == TSymbol) || (DSDWORD[buffer] == TList)
-
 
375
			{
-
 
376
				buffer = DSDWORD[buffer+4];
-
 
377
				if (DSBYTE[buffer] == '\'') return tree;
-
 
378
 
-
 
379
				args = malloc(32);
-
 
380
				key = 0;
-
 
381
				while (1)
-
 
382
				{
-
 
383
					buffer = indexArray(list, key);
-
 
384
					buffer = DSDWORD[buffer];
-
 
385
					if (!buffer) break;
-
 
386
					item = indexArray(args, key);
-
 
387
					DSDWORD[item] = lisp(buffer);
-
 
388
					key++;
-
 
389
				}
-
 
390
				item = indexArray(args, 0);
-
 
391
				item = DSDWORD[item];
-
 
392
				if (DSDWORD[item] == Proc)
-
 
393
				{
-
 
394
					EAX = DSDWORD[item+4];
-
 
395
					EAX(args);
-
 
396
					if (!EAX)
-
 
397
					{
-
 
398
						malloc(sizeStruct);
-
 
399
						DSDWORD[EAX] = TSymbol;
-
 
400
						DSDWORD[EAX+4] = NIL;
-
 
401
						return EAX;
-
 
402
					}
-
 
403
					return EAX;
-
 
404
				}
-
 
405
				malloc(sizeStruct);
-
 
406
				DSDWORD[EAX] = TSymbol;
-
 
407
				DSDWORD[EAX+4] = NIL;
-
 
408
				return EAX;
-
 
409
			}
-
 
410
 
-
 
411
			malloc(sizeStruct);
186
		}
412
				DSDWORD[EAX] = TSymbol;
187
		code++;
-
 
188
		args++;
-
 
189
	}
-
 
190
	args--;
-
 
191
	ret = StdCall(args, name, dataArgs);
-
 
192
	free(name);
413
				DSDWORD[EAX+4] = NIL;
Line -... Line 414...
-
 
414
				return EAX;
-
 
415
	}
193
	//free(dataArgs);
416
}
194
	return ret;
417
 
195
}
418
#include "stdcall.h"
196
 
419
 
197
void main()
420
void main()
Line 198... Line 421...
198
{
421
{
199
	dword brainFuckCode = 0;
-
 
200
	word maxLoop = 1000;
-
 
Line -... Line 422...
-
 
422
	dword xxx = 0;
201
	dword txt = "(set name (input \"Enter you name: \"))(print \"You name \" (get name))";
423
	dword item = 0;
-
 
424
	dword data = 0;
-
 
425
	
Line 202... Line 426...
202
	
426
	buffer = malloc(bufferSize);
203
	buffer = malloc(bufferSize);
427
 
204
	memory = malloc(memoryBrainfuck);
428
	variable = malloc(32);
205
	stack = malloc(stackBrainFuck);
429
	NIL = "NIL";
206
	
-
 
207
	Init();
430
 
208
	
431
	initFunctionLisp();
209
	IF(DSBYTE[I_Param])
432
	
210
	{
433
	if(DSBYTE[I_Param])
211
		IF(io.read(I_Param))
434
	{
212
		{
435
		IF(io.read(I_Param))
213
			code = EAX;
436
		{
214
			evalLisp();
437
			lisp(tree(lexer(EAX)));
215
		}
438
		}
-
 
439
	}
216
	}
440
	else
217
	else 
441
	{
218
	{
442
		consoleInit();
219
		consoleInit();
443
		con_printf stdcall ("Lisp v2.0\r\n");
220
		con_printf stdcall ("Lisp interpreter v1.5\r\n");
444
		while(maxLoop)
221
		while(maxLoop)
-
 
222
		{
445
		{
223
			con_printf stdcall ("\r\n$ ");
446
			treeItem = 0;
224
			con_gets stdcall(buffer, bufferSize);
447
			con_printf stdcall ("\r\n$ ");
Line 225... Line 448...
225
			code = EAX;
448
			con_gets stdcall(buffer+1, bufferSize);