Subversion Repositories Kolibri OS

Rev

Rev 1005 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1005 barsuk 1
 
2
 
3
4
// token types
5
 
6
#define VARIABLE 2
7
#define NUMBER 3
8
#define FUNCTION 4
9
#define FINISHED 10
10
11
// error codes
12
 
13
#define ERR_BADNUMER -2
14
#define ERR_GENERAL -3
15
#define ERR_NOBRACKET -4
16
#define ERR_BADVARIABLE -5
17
#define ERR_OVERFLOW -6
18
19
double __cdecl tg(double d)
20
 
1764 clevermous 21
	return sin(d) / cos(d);
1005 barsuk 22
}
23
24
double __cdecl ctg(double d)
25
 
1764 clevermous 26
	return cos(d) / sin(d);
1005 barsuk 27
}
28
29
double __cdecl exp(double x)
30
 
1764 clevermous 31
	__asm {
1005 barsuk 32
		fld	x
33
		FLDL2E
34
		FMUL
35
36
		FLD st(0)
37
 
38
		FLD1
39
 
40
		FXCH
41
 
42
		F2XM1
43
		fadd
44
		FSCALE
45
		FSTP st(1)
46
	}
47
48
}
49
 
50
double __cdecl log(double x)
51
 
1764 clevermous 52
	//return 0.0;
1005 barsuk 53
	__asm {
54
		FLD1
55
		FLD     x
56
		FYL2X
57
		FLDLN2
58
		FMUL
59
	}
60
}
61
62
double __cdecl sqrt(double x)
63
 
1764 clevermous 64
	__asm {
1005 barsuk 65
		fld x
66
		fsqrt
67
	}
68
}
69
70
double __cdecl atan(double x)
71
 
1764 clevermous 72
	return 0.0; // в лом
1005 barsuk 73
}
74
75
double pow(double x, double y)
76
 
77
	return 0.0; // в лом, пускай считают черех exp и log
78
}
79
80
81
 
82
 
83
1764 clevermous 84
// used to link function name to the function
1005 barsuk 85
 
86
{
87
	char name[10];
88
	matfunc f;
89
} func;
90
91
// the list of functions
92
 
93
func functions[max_func] =
94
{
95
	"", NULL,
96
	"sin", &sin,
97
	"cos", &cos,
98
	"exp", &exp,
99
	"sqrt", &sqrt,
100
	"log", &log,
101
	"tg", &tg,
102
	"ctg", &ctg,
103
	"arcsin", &asin,
104
	"arccos", &acos,
105
	"arctg", &atan,
106
	"abs", &fabs
107
};
108
109
// all delimiters
110
 
111
112
// structure for most parser functions
113
 
114
	char token[80];
115
 
116
	char *prog;
117
	double x_value;
118
  int code;    // error code
119
120
int isdelim(char c)
121
 
122
	//return strchr(delim, c) != 0;
123
	for (int i = 0; i < 14; i++)
124
		if (c == delim[i])
125
			return 1;
126
	return 0;
127
}
128
129
int isdigit(char c)
130
 
131
	return (c >= '0' && c <= '9');
132
}
133
134
int isalpha2(char c)
135
 
136
	return ((c >= 'a' && c <= 'z')
137
		|| (c >= 'A' && c <= 'Z'));
138
}
139
140
int iswhite(char c)
141
 
142
	return (c==' ' || c=='\t');
143
}
144
145
146
 
147
 
148
	::code = code;
149
//  longjmp(j, code);
150
}
151
152
void set_exp(char *exp, double x)
153
 
154
	prog = exp;
155
	x_value = x;
156
}
157
158
int get_token()
159
 
160
	int tok;
161
	char *temp;
162
	(token_type) = 0;
163
	tok = 0;
164
	temp = (token);
165
166
	if (*(prog) == '\0')
167
 
168
		*(token) = 0;
169
		tok = FINISHED;
170
		return ((token_type) = DELIMITER);
171
	}
172
	while (iswhite(*(prog))) ++(prog);
173
	if (isdelim(*(prog)))
174
	{
175
		*temp = *(prog);
176
		(prog)++;
177
		temp++;
178
		*temp = 0;
179
		return ((token_type) = DELIMITER);
180
	}
181
	if (isdigit(*(prog)))
182
	{
183
		while (!isdelim(*(prog)))
184
			*temp++=*(prog)++;
185
		*temp = '\0';
186
		return ((token_type) = NUMBER);
187
	}
188
	if (isalpha2(*(prog)))
189
	{
190
		while (!isdelim(*(prog)))
191
			*temp++=*(prog)++;
192
		(token_type) = VARIABLE;
193
	}
194
	*temp = '\0';
195
	if ((token_type) == VARIABLE)
196
	{
197
		tok = look_up((token));
198
		if (tok)
199
			(token_type) = FUNCTION;
200
	}
201
	return (token_type);
202
}
203
204
int sign(double d)
205
 
206
  if (d > 0.0)
207
    return 1.0;
208
  if (d < 0.0)
209
    return -1.0;
210
  return 0.0;
211
}
212
213
void putback()
214
 
215
	char *t;
216
	t = (token);
217
	for (;*t;t++)
218
		(prog)--;
219
}
220
221
int get_exp(double *hold)
222
 
223
  int res;
224
  code = 0;
225
//  if (res = setjmp(j) != 0)
226
//    return code;
227
	get_token();
228
	if (!*(token))
229
	{
230
		return 0;
231
	}
232
	level2( hold);
233
	putback();
234
  return 0;
235
}
236
237
void level2(double *hold)
238
 
239
	char op;
240
	double h;
241
242
	level3( hold);
243
 
244
	{
245
		get_token();
246
		level3( &h);
247
		arith(op, hold, &h);
248
	}
249
}
250
251
void level3(double *hold)
252
 
253
	char op;
254
	double h;
255
256
	level4( hold);
257
 
258
	{
259
		get_token();
260
		level4( &h);
261
		arith( op, hold, &h);
262
	}
263
}
264
265
void level4(double *hold)
266
 
267
	double h;
268
	level5( hold);
269
270
	if (*(token) == '^')
271
 
272
		get_token();
273
		level5( &h);
274
		arith( '^', hold, &h);
275
	}
276
}
277
278
void level5(double *hold)
279
 
280
	char op;
281
282
	op = 0;
283
 
284
	{
285
		op = *(token);
286
		get_token();
287
	}
288
	level6( hold);
289
290
	if (op)
291
 
292
}
293
294
void level6(double *hold)
295
 
296
	if ((*(token) == '(') && ((token_type) == DELIMITER))
297
	{
298
		get_token();
299
		level2( hold);
300
		if (*(token) != ')')
301
      serror( ERR_NOBRACKET);
302
		get_token();
303
	}
304
	else
305
		primitive( hold);
306
}
307
308
void calc_function(double *hold)
309
 
310
  double d;
311
	int i;
312
313
	i = look_up(token);
314
 
315
	if (i == 0)
316
 
317
318
	get_token();
319
 
320
		serror(ERR_NOBRACKET);	// error
321
	get_token();
322
	level2(hold);
323
	get_token();
324
325
  d = functions[i].f(*hold);
326
 
327
//  else
328
//    serror( ERR_OVERFLOW);
329
330
}
331
 
332
void primitive(double *hold)
333
 
334
	switch (token_type)
335
	{
336
	case VARIABLE:
337
		*hold = find_var(token);
338
		get_token();
339
		return;
340
	case NUMBER:
341
    //
342
		//*hold = atof((token));
343
    //if (sscanf(token, "%lf", hold) != 1)
344
	*hold = convert(token);
345
	if (*hold == ERROR)
346
      serror( ERR_BADNUMER);
347
		get_token();
348
		return;
349
	case FUNCTION:
350
		calc_function( hold);
351
		return;
352
	default:	// error
353
		return;
354
	}
355
}
356
357
void arith(char op, double *r, double *h)
358
 
359
	double t;
360
	switch(op)
361
	{
362
	case '-':
363
		*r = *r - *h;
364
		break;
365
	case '+':
366
		*r = *r + *h;
367
		break;
368
	case '*':
369
		*r = *r * *h;
370
		break;
371
	case '/':
372
    if (*h == 0)
373
      serror( ERR_OVERFLOW);
374
    else
375
		  *r = (*r) / (*h);
376
		break;
377
	case '%':
378
		t = (*r) / (*h);
379
		*r = *r - (t * (*h));
380
		break;
381
	case '^':
382
		*r = pow(*r, *h);
383
		break;
384
	}
385
}
386
387
void unary(char op, double *r)
388
 
389
	if (op == '-')
390
		*r = -(*r);
391
}
392
393
double find_var(char *s)
394
 
395
	//return 0;	// not imp
396
	//int i;
397
398
	//for (i = 0; i < kvar; i++)
399
 
400
	//		return vars[i].value;
401
402
	if (s[1] == '\0' && (s[0] == 'x' || s[0] == 'X'))
403
 
404
		return x_value;
405
406
	serror( ERR_BADVARIABLE);
407
 
408
409
	//printf("\nPlease enter value for variable \"%s\": ", s);
410
 
411
	//strcpy(vars[kvar].name, s);
412
	//kvar++;
413
	//return vars[kvar - 1].value;
414
}
415
416
bool strcmp(char *s1, char *s2)
417
 
418
	int i;
419
420
	for (i = 0;;i++)
421
 
422
		if (s1[i] == '\0')
423
			if (s2[i] == '\0')
424
				return 0;
425
			else
426
				return 1;
427
		else
428
			if (s2[i] == '\0')
429
				return 1;
430
			else
431
			{
432
				if (s1[i] != s2[i])
433
					return 1;
434
			}
435
	}
436
}
437
438
int look_up(char *s)
439
 
440
	int i;
441
442
	for (i = 0; i < max_func; i++)
443
 
444
			return i;
445
	return 0;	// search command/function name
446
}
447
448
/*
449
 
450
{
451
	int len = strlen(buf);
452
	char *d = (char *)malloc(len + 1);
453
	char *t = buf;
454
	strcpy(d, buf);
455
	d[len] = '\0';
456
457
	int i;
458
 
459
	for (i = 0; i < len; i++)
460
 
461
			*t++=d[i];
462
	*t++='\0';
463
	free(d);
464
}
465
*/
466
467
/*
468
 
469
{
470
471
	 = (parser_struct)malloc(sizeof(parser_struct));
472
 
473
	char buffer[256];
474
475
476
 
477
 
478
	gets(buffer);
479
480
	prog = buffer;
481
 
482
483
	a = 0;
484
 
485
	get_exp( &a);
486
487
	printf("result: %lg\n", a);
488
 
489
490
}
491
 
492