fork download
  1. /*
  2. expr --> ( expr ) | expr op expr | number | expr expr | x
  3.   x --> [:alpha:][:word:]*
  4. op --> + | - | * | /
  5. number --> integer
  6. integer --> integer digit | digit
  7. digit --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  8.  
  9.   built-in function: pow (pow a b = a^b), sin
  10. */
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <math.h>
  15. #include <ctype.h>
  16.  
  17. #define SUCC 0
  18. #define FAIL 1
  19. #define YES 0
  20. #define NO 1
  21. #define EMPTY -1
  22. #define STACK_LIMIT 80
  23.  
  24. struct ENV;
  25. union data;
  26. struct function {
  27. void (*code)(struct ENV*, union data);
  28. struct ENV* env;
  29. };
  30.  
  31. typedef union data { char op; double value; struct function fun; } DATA;
  32.  
  33. typedef struct stack {
  34. int type; /* 0: operator, 1: data, 2: function */
  35. DATA data;
  36. int priority; } STACK_DATA;
  37.  
  38. struct stack STACK[STACK_LIMIT];
  39. int STACK_TOP = EMPTY;
  40.  
  41. char expr[80];
  42. int i = 0;
  43.  
  44. void push( STACK_DATA data )
  45.  
  46. {
  47. if ( STACK_TOP < STACK_LIMIT - 1 )
  48. STACK[++STACK_TOP] = data;
  49. else
  50. {
  51. printf( "\nStack Overflow!!\n" );
  52. exit( 1 );
  53. }
  54. }
  55.  
  56. STACK_DATA pop( void )
  57.  
  58. {
  59. if ( STACK_TOP != EMPTY )
  60. return( STACK[STACK_TOP--] );
  61. else
  62. {
  63. printf( "\nStack Underflow!!\n" );
  64. exit( 1 );
  65. }
  66. }
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73. struct ENV {
  74. char var[16];
  75. int type;
  76. DATA value;
  77. struct ENV *next;
  78. };
  79.  
  80. struct ENV *top_env, env_mem[100];
  81. int env_num;
  82. struct ENV* alloc_env(void) {
  83. if (env_num == 100) {
  84. printf("not enough memory\n");
  85. exit(1);
  86. }
  87. struct ENV* env = env_mem+env_num;
  88. ++env_num;
  89. return env;
  90. }
  91.  
  92. struct ENV* lookup_assume_exists(struct ENV* curr, const char* var) {
  93. while (curr) {
  94. if (strcmp(var, curr->var) == 0)
  95. return curr;
  96. curr = curr->next;
  97. }
  98. printf("Unbound variable %s\n", var);
  99. exit(1);
  100. }
  101.  
  102. void variable(void) {
  103. char var[16];
  104. int k = 0;
  105. while (expr[i] && isalnum(expr[i])) {
  106. var[k] = expr[i];
  107. ++i;
  108. ++k;
  109. }
  110. var[k] = 0;
  111.  
  112. struct ENV* entry = lookup_assume_exists(top_env, var);
  113. STACK_DATA data;
  114. data.type = entry->type;
  115. data.data = entry->value;
  116. data.priority = 0;
  117. push(data);
  118. }
  119.  
  120. void apply() {
  121. DATA arg = pop().data;
  122. struct function f = pop().data.fun;
  123. f.code(f.env, arg);
  124. }
  125.  
  126. void push_sin(struct ENV* env_unused, DATA arg) {
  127. STACK_DATA data;
  128. data.type = 1;
  129. data.data.value = sin(arg.value);
  130. data.priority = 0;
  131. push(data);
  132. }
  133.  
  134. void push_pow_has_base(struct ENV* env, DATA arg) {
  135. STACK_DATA data;
  136. data.type = 1;
  137. data.data.value = pow(lookup_assume_exists(env, "base")->value.value, arg.value);
  138. data.priority = 0;
  139. push(data);
  140. }
  141.  
  142. void push_pow(struct ENV* env, DATA arg) {
  143. struct ENV *cl = alloc_env();
  144. strcpy(cl->var, "base");
  145. cl->type = 1;
  146. cl->value.value = arg.value;
  147. cl->next = env;
  148.  
  149. STACK_DATA data;
  150. data.type = 2;
  151. data.data.fun.code = push_pow_has_base;
  152. data.data.fun.env = cl;
  153. data.priority = 0;
  154. push(data);
  155. }
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164. int number( void )
  165.  
  166. {
  167. STACK_DATA data;
  168. int k = 0, mantissa = NO;
  169. char value[80];
  170.  
  171. while ( expr[i] >= '0' && expr[i] <= '9' ) /* integer */
  172. {
  173. mantissa = YES;
  174. value[k++] = expr[i++];
  175. }
  176.  
  177. value[k] = '\0';
  178.  
  179. data.type = 1;
  180. data.data.value = atof( value );
  181. data.priority = 0;
  182. push( data );
  183.  
  184. return( SUCC );
  185. }
  186.  
  187. int evaluate( void )
  188.  
  189. {
  190. STACK_DATA data, data1, data2, opcode;
  191.  
  192. if ( STACK_TOP == EMPTY )
  193. return( FAIL );
  194. data1 = pop();
  195. if ( data1.type != 1 )
  196. return( FAIL ); /* not an operand */
  197.  
  198. if ( STACK_TOP == EMPTY )
  199. return( FAIL );
  200. opcode = pop();
  201. if ( opcode.type != 0 )
  202. return( FAIL ); /* not an operator */
  203.  
  204. if ( STACK_TOP == EMPTY )
  205. return( FAIL );
  206. data2 = pop();
  207. if ( data2.type != 1 )
  208. return( FAIL ); /* not an operand */
  209.  
  210. switch( opcode.data.op )
  211. {
  212. case '+' : data.data.value = data2.data.value + data1.data.value;
  213. break;
  214. case '-' : data.data.value = data2.data.value - data1.data.value;
  215. break;
  216. case '*' : data.data.value = data2.data.value * data1.data.value;
  217. break;
  218. case '/' : data.data.value = data2.data.value / data1.data.value;
  219. break;
  220. default: return( FAIL );
  221. break;
  222. }
  223.  
  224. data.type = 1;
  225. data.priority = 0;
  226. push( data );
  227.  
  228. return( SUCC );
  229. }
  230.  
  231. int right_parenthesis( void )
  232.  
  233. {
  234. STACK_DATA data;
  235.  
  236. while ( STACK_TOP != EMPTY )
  237. {
  238. if ( STACK_TOP-1 != EMPTY && STACK[STACK_TOP-1].data.op == '(' )
  239. {
  240. i++;
  241. data = pop();
  242. pop(); /* remove left parenthesis */
  243. push( data );
  244. return( SUCC );
  245. }
  246. else if ( evaluate() == FAIL )
  247. return( FAIL );
  248. }
  249.  
  250. return( FAIL );
  251. }
  252.  
  253. int parenthesis( void )
  254. {
  255. STACK_DATA data;
  256.  
  257. data.type = 0;
  258. data.data.op = expr[i++];
  259. data.priority = 0; /* left_parenthesis */
  260. push( data );
  261.  
  262. return( SUCC );
  263. }
  264.  
  265. int op( void )
  266. {
  267. STACK_DATA data;
  268.  
  269. switch ( expr[i] )
  270. {
  271. case '+' :
  272. case '-' : data.priority = 1;
  273. break;
  274. case '*' :
  275. case '/' : data.priority = 2;
  276. break;
  277. default :
  278. return( FAIL );
  279. }
  280.  
  281. while ( STACK_TOP > 0 && data.priority <= STACK[STACK_TOP-1].priority )
  282. {
  283. if ( evaluate() == FAIL )
  284. return( FAIL );
  285. }
  286.  
  287. data.type = 0;
  288. data.data.op = expr[i++];
  289. push( data );
  290.  
  291. return( SUCC );
  292. }
  293.  
  294. int expression( void )
  295. {
  296. while ( expr[i] == ' ' ) /* skip the leading spaces */
  297. i++;
  298.  
  299. if ( expr[i] == '(' )
  300. return( parenthesis() ); /* ( expr) */
  301.  
  302. if ( expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/' )
  303. return( op() ); /* expr op expr */
  304.  
  305. if ( expr[i] >= '0' && expr[i] <= '9' )
  306. return( number() ); /* number */
  307.  
  308. if ( expr[i] == ')') /* end of parenthesis */
  309. return( right_parenthesis() );
  310.  
  311. if (isalpha(expr[i])) {
  312. variable();
  313. return SUCC;
  314. }
  315.  
  316. if ( expr[i] == '\0') /* end of expression */
  317. return( SUCC );
  318. else
  319. return( FAIL );
  320. }
  321.  
  322. int result( void )
  323.  
  324. {
  325. while ( STACK_TOP > 0 )
  326. {
  327. if ( evaluate() == FAIL )
  328. return( FAIL );
  329. }
  330.  
  331. return( SUCC );
  332. }
  333.  
  334. void calculate( void )
  335. {
  336. STACK_DATA data;
  337.  
  338. while ( expr[i] != '\0' )
  339. {
  340. if ( expression() == FAIL ) /* parse the exspression */
  341. break;
  342. if (STACK_TOP >= 1 && STACK[STACK_TOP-1].type == 2 && (STACK[STACK_TOP].type == 1 || STACK[STACK_TOP].type == 2))
  343. apply();
  344. }
  345.  
  346. if ( expr[i] == '\0' ) /* end of expression */
  347. {
  348. if ( result() == SUCC && STACK_TOP == 0 )
  349. {
  350. data = pop();
  351. if ( data.type == 1 )
  352. printf( "The result is %g\n", data.data.value );
  353. else
  354. printf( "Error : Illegal expression\n" );
  355. }
  356. else
  357. printf( "Error : Illegal expression\n" );
  358. }
  359. else
  360. printf( "Error : Illegal expression\n" );
  361. }
  362.  
  363. void init( void )
  364. {
  365. STACK_TOP = EMPTY; /* clear stack */
  366. i = 0;
  367.  
  368.  
  369.  
  370.  
  371.  
  372. env_num = 0;
  373.  
  374. top_env = NULL;
  375. struct ENV* env_sin = alloc_env();
  376. strcpy(env_sin->var, "sin");
  377. env_sin->type = 2;
  378. env_sin->value.fun.code = push_sin;
  379. env_sin->next = NULL;
  380.  
  381. struct ENV* env_pow = alloc_env();
  382. strcpy(env_pow->var, "pow");
  383. env_pow->type = 2;
  384. env_pow->value.fun.code = push_pow;
  385. env_pow->next = env_sin;
  386.  
  387. top_env = env_pow;
  388. env_sin->value.fun.env = top_env;
  389. env_pow->value.fun.env = top_env;
  390. }
  391.  
  392. int main( void )
  393. {
  394. char ch;
  395.  
  396. do
  397. {
  398. init(); /* initialize */
  399.  
  400. printf( "Please keyin expression to be evaluated \n" );
  401. gets( expr );
  402.  
  403. calculate();
  404.  
  405. printf( "Continue (y/n) ? " );
  406. ch = getchar();
  407. } while( !( ch == 'n' || ch == 'N' ) );
  408.  
  409. return( 0 );
  410. }
  411.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Main.java:11: error: illegal character: '#'
#include <stdio.h>
^
Main.java:11: error: class, interface, or enum expected
#include <stdio.h>
         ^
Main.java:12: error: illegal character: '#'
#include <stdlib.h>
^
Main.java:13: error: illegal character: '#'
#include <string.h>
^
Main.java:14: error: illegal character: '#'
#include <math.h>
^
Main.java:15: error: illegal character: '#'
#include <ctype.h>
^
Main.java:17: error: illegal character: '#'
#define SUCC 0
^
Main.java:18: error: illegal character: '#'
#define FAIL 1
^
Main.java:19: error: illegal character: '#'
#define YES 0
^
Main.java:20: error: illegal character: '#'
#define NO 1
^
Main.java:21: error: illegal character: '#'
#define EMPTY -1
^
Main.java:22: error: illegal character: '#'
#define STACK_LIMIT 80
^
Main.java:25: error: class, interface, or enum expected
union data;
^
Main.java:26: error: class, interface, or enum expected
struct function {
^
Main.java:28: error: class, interface, or enum expected
  struct ENV* env;
  ^
Main.java:29: error: class, interface, or enum expected
};
^
Main.java:31: error: class, interface, or enum expected
typedef union data { char op; double value; struct function fun; } DATA;
^
Main.java:31: error: class, interface, or enum expected
typedef union data { char op; double value; struct function fun; } DATA;
                              ^
Main.java:31: error: class, interface, or enum expected
typedef union data { char op; double value; struct function fun; } DATA;
                                            ^
Main.java:31: error: class, interface, or enum expected
typedef union data { char op; double value; struct function fun; } DATA;
                                                                 ^
Main.java:33: error: class, interface, or enum expected
typedef struct stack {
^
Main.java:35: error: class, interface, or enum expected
	DATA data;
	^
Main.java:36: error: class, interface, or enum expected
	int priority; } STACK_DATA;
	^
Main.java:36: error: class, interface, or enum expected
	int priority; } STACK_DATA;
	              ^
Main.java:38: error: class, interface, or enum expected
struct stack STACK[STACK_LIMIT];
^
Main.java:39: error: class, interface, or enum expected
int STACK_TOP = EMPTY;
^
Main.java:41: error: class, interface, or enum expected
char expr[80];
^
Main.java:42: error: class, interface, or enum expected
int i = 0;
^
Main.java:44: error: class, interface, or enum expected
void push( STACK_DATA data )
^
Main.java:49: error: class, interface, or enum expected
  else
  ^
Main.java:52: error: class, interface, or enum expected
    exit( 1 );
    ^
Main.java:53: error: class, interface, or enum expected
  }
  ^
Main.java:61: error: class, interface, or enum expected
  else
  ^
Main.java:64: error: class, interface, or enum expected
    exit( 1 );
    ^
Main.java:65: error: class, interface, or enum expected
  }
  ^
Main.java:75: error: class, interface, or enum expected
  int type;
  ^
Main.java:76: error: class, interface, or enum expected
  DATA value;
  ^
Main.java:77: error: class, interface, or enum expected
  struct ENV *next;
  ^
Main.java:78: error: class, interface, or enum expected
};
^
Main.java:80: error: class, interface, or enum expected
struct ENV *top_env, env_mem[100];
^
Main.java:81: error: class, interface, or enum expected
int env_num;
^
Main.java:82: error: class, interface, or enum expected
struct ENV* alloc_env(void) {
^
Main.java:85: error: class, interface, or enum expected
    exit(1);
    ^
Main.java:86: error: class, interface, or enum expected
  }
  ^
Main.java:88: error: class, interface, or enum expected
  ++env_num;
  ^
Main.java:89: error: class, interface, or enum expected
  return env;
  ^
Main.java:90: error: class, interface, or enum expected
}
^
Main.java:96: error: class, interface, or enum expected
    curr = curr->next;
    ^
Main.java:97: error: class, interface, or enum expected
  }
  ^
Main.java:99: error: class, interface, or enum expected
  exit(1);
  ^
Main.java:100: error: class, interface, or enum expected
}
^
Main.java:104: error: class, interface, or enum expected
  int k = 0;
  ^
Main.java:105: error: class, interface, or enum expected
  while (expr[i] && isalnum(expr[i])) {
  ^
Main.java:107: error: class, interface, or enum expected
    ++i;
    ^
Main.java:108: error: class, interface, or enum expected
    ++k;
    ^
Main.java:109: error: class, interface, or enum expected
  }
  ^
Main.java:112: error: class, interface, or enum expected
  struct ENV* entry = lookup_assume_exists(top_env, var);
  ^
Main.java:113: error: class, interface, or enum expected
  STACK_DATA data;
  ^
Main.java:114: error: class, interface, or enum expected
  data.type = entry->type;
  ^
Main.java:115: error: class, interface, or enum expected
  data.data = entry->value;
  ^
Main.java:116: error: class, interface, or enum expected
  data.priority = 0;
  ^
Main.java:117: error: class, interface, or enum expected
  push(data);
  ^
Main.java:118: error: class, interface, or enum expected
}
^
Main.java:122: error: class, interface, or enum expected
  struct function f = pop().data.fun;
  ^
Main.java:123: error: class, interface, or enum expected
  f.code(f.env, arg);
  ^
Main.java:124: error: class, interface, or enum expected
}
^
Main.java:128: error: class, interface, or enum expected
  data.type = 1;
  ^
Main.java:129: error: class, interface, or enum expected
  data.data.value = sin(arg.value);
  ^
Main.java:130: error: class, interface, or enum expected
  data.priority = 0;
  ^
Main.java:131: error: class, interface, or enum expected
  push(data);
  ^
Main.java:132: error: class, interface, or enum expected
}
^
Main.java:136: error: class, interface, or enum expected
  data.type = 1;
  ^
Main.java:137: error: class, interface, or enum expected
  data.data.value = pow(lookup_assume_exists(env, "base")->value.value, arg.value);
  ^
Main.java:138: error: class, interface, or enum expected
  data.priority = 0;
  ^
Main.java:139: error: class, interface, or enum expected
  push(data);
  ^
Main.java:140: error: class, interface, or enum expected
}
^
Main.java:144: error: class, interface, or enum expected
  strcpy(cl->var, "base");
  ^
Main.java:145: error: class, interface, or enum expected
  cl->type = 1;
  ^
Main.java:146: error: class, interface, or enum expected
  cl->value.value = arg.value;
  ^
Main.java:147: error: class, interface, or enum expected
  cl->next = env;
  ^
Main.java:149: error: class, interface, or enum expected
  STACK_DATA data;
  ^
Main.java:150: error: class, interface, or enum expected
  data.type = 2;
  ^
Main.java:151: error: class, interface, or enum expected
  data.data.fun.code = push_pow_has_base;
  ^
Main.java:152: error: class, interface, or enum expected
  data.data.fun.env = cl;
  ^
Main.java:153: error: class, interface, or enum expected
  data.priority = 0;
  ^
Main.java:154: error: class, interface, or enum expected
  push(data);
  ^
Main.java:155: error: class, interface, or enum expected
}
^
Main.java:168: error: class, interface, or enum expected
	int k = 0, mantissa = NO;
	^
Main.java:169: error: class, interface, or enum expected
	char value[80];
	^
Main.java:171: error: class, interface, or enum expected
	while ( expr[i] >= '0' && expr[i] <= '9' )		/* integer */
	^
Main.java:174: error: class, interface, or enum expected
		value[k++] = expr[i++];
		^
Main.java:175: error: class, interface, or enum expected
	}
	^
Main.java:179: error: class, interface, or enum expected
	data.type = 1;
	^
Main.java:180: error: class, interface, or enum expected
	data.data.value = atof( value );
	^
Main.java:181: error: class, interface, or enum expected
	data.priority = 0;
	^
Main.java:182: error: class, interface, or enum expected
	push( data );
	^
Main.java:184: error: class, interface, or enum expected
	return( SUCC );
	^
Main.java:185: error: class, interface, or enum expected
}
^
Main.java:192: error: class, interface, or enum expected
	if ( STACK_TOP == EMPTY )
	^
Main.java:194: error: class, interface, or enum expected
	data1 = pop();
	^
100 errors
stdout
Standard output is empty