/*
expr --> ( expr ) | expr op expr | number | expr expr | x
x --> [:alpha:][:word:]*
op --> + | - | * | /
number --> integer
integer --> integer digit | digit
digit --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
built-in function: pow (pow a b = a^b), sin
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#define SUCC 0
#define FAIL 1
#define YES 0
#define NO 1
#define EMPTY -1
#define STACK_LIMIT 80
struct ENV;
union data;
struct function {
void (*code)(struct ENV*, union data);
struct ENV* env;
};
typedef union data { char op; double value; struct function fun; } DATA;
typedef struct stack {
int type; /* 0: operator, 1: data, 2: function */
DATA data;
int priority; } STACK_DATA;
struct stack STACK[STACK_LIMIT];
int STACK_TOP = EMPTY;
char expr[80];
int i = 0;
void push( STACK_DATA data )
{
if ( STACK_TOP < STACK_LIMIT - 1 )
STACK[++STACK_TOP] = data;
else
{
printf( "\nStack Overflow!!\n" );
exit( 1 );
}
}
STACK_DATA pop( void )
{
if ( STACK_TOP != EMPTY )
return( STACK[STACK_TOP--] );
else
{
printf( "\nStack Underflow!!\n" );
exit( 1 );
}
}
struct ENV {
char var[16];
int type;
DATA value;
struct ENV *next;
};
struct ENV *top_env, env_mem[100];
int env_num;
struct ENV* alloc_env(void) {
if (env_num == 100) {
printf("not enough memory\n");
exit(1);
}
struct ENV* env = env_mem+env_num;
++env_num;
return env;
}
struct ENV* lookup_assume_exists(struct ENV* curr, const char* var) {
while (curr) {
if (strcmp(var, curr->var) == 0)
return curr;
curr = curr->next;
}
printf("Unbound variable %s\n", var);
exit(1);
}
void variable(void) {
char var[16];
int k = 0;
while (expr[i] && isalnum(expr[i])) {
var[k] = expr[i];
++i;
++k;
}
var[k] = 0;
struct ENV* entry = lookup_assume_exists(top_env, var);
STACK_DATA data;
data.type = entry->type;
data.data = entry->value;
data.priority = 0;
push(data);
}
void apply() {
DATA arg = pop().data;
struct function f = pop().data.fun;
f.code(f.env, arg);
}
void push_sin(struct ENV* env_unused, DATA arg) {
STACK_DATA data;
data.type = 1;
data.data.value = sin(arg.value);
data.priority = 0;
push(data);
}
void push_pow_has_base(struct ENV* env, DATA arg) {
STACK_DATA data;
data.type = 1;
data.data.value = pow(lookup_assume_exists(env, "base")->value.value, arg.value);
data.priority = 0;
push(data);
}
void push_pow(struct ENV* env, DATA arg) {
struct ENV *cl = alloc_env();
strcpy(cl->var, "base");
cl->type = 1;
cl->value.value = arg.value;
cl->next = env;
STACK_DATA data;
data.type = 2;
data.data.fun.code = push_pow_has_base;
data.data.fun.env = cl;
data.priority = 0;
push(data);
}
int number( void )
{
STACK_DATA data;
int k = 0, mantissa = NO;
char value[80];
while ( expr[i] >= '0' && expr[i] <= '9' ) /* integer */
{
mantissa = YES;
value[k++] = expr[i++];
}
value[k] = '\0';
data.type = 1;
data.data.value = atof( value );
data.priority = 0;
push( data );
return( SUCC );
}
int evaluate( void )
{
STACK_DATA data, data1, data2, opcode;
if ( STACK_TOP == EMPTY )
return( FAIL );
data1 = pop();
if ( data1.type != 1 )
return( FAIL ); /* not an operand */
if ( STACK_TOP == EMPTY )
return( FAIL );
opcode = pop();
if ( opcode.type != 0 )
return( FAIL ); /* not an operator */
if ( STACK_TOP == EMPTY )
return( FAIL );
data2 = pop();
if ( data2.type != 1 )
return( FAIL ); /* not an operand */
switch( opcode.data.op )
{
case '+' : data.data.value = data2.data.value + data1.data.value;
break;
case '-' : data.data.value = data2.data.value - data1.data.value;
break;
case '*' : data.data.value = data2.data.value * data1.data.value;
break;
case '/' : data.data.value = data2.data.value / data1.data.value;
break;
default: return( FAIL );
break;
}
data.type = 1;
data.priority = 0;
push( data );
return( SUCC );
}
int right_parenthesis( void )
{
STACK_DATA data;
while ( STACK_TOP != EMPTY )
{
if ( STACK_TOP-1 != EMPTY && STACK[STACK_TOP-1].data.op == '(' )
{
i++;
data = pop();
pop(); /* remove left parenthesis */
push( data );
return( SUCC );
}
else if ( evaluate() == FAIL )
return( FAIL );
}
return( FAIL );
}
int parenthesis( void )
{
STACK_DATA data;
data.type = 0;
data.data.op = expr[i++];
data.priority = 0; /* left_parenthesis */
push( data );
return( SUCC );
}
int op( void )
{
STACK_DATA data;
switch ( expr[i] )
{
case '+' :
case '-' : data.priority = 1;
break;
case '*' :
case '/' : data.priority = 2;
break;
default :
return( FAIL );
}
while ( STACK_TOP > 0 && data.priority <= STACK[STACK_TOP-1].priority )
{
if ( evaluate() == FAIL )
return( FAIL );
}
data.type = 0;
data.data.op = expr[i++];
push( data );
return( SUCC );
}
int expression( void )
{
while ( expr[i] == ' ' ) /* skip the leading spaces */
i++;
if ( expr[i] == '(' )
return( parenthesis() ); /* ( expr) */
if ( expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/' )
return( op() ); /* expr op expr */
if ( expr[i] >= '0' && expr[i] <= '9' )
return( number() ); /* number */
if ( expr[i] == ')') /* end of parenthesis */
return( right_parenthesis() );
if (isalpha(expr[i])) {
variable();
return SUCC;
}
if ( expr[i] == '\0') /* end of expression */
return( SUCC );
else
return( FAIL );
}
int result( void )
{
while ( STACK_TOP > 0 )
{
if ( evaluate() == FAIL )
return( FAIL );
}
return( SUCC );
}
void calculate( void )
{
STACK_DATA data;
while ( expr[i] != '\0' )
{
if ( expression() == FAIL ) /* parse the exspression */
break;
if (STACK_TOP >= 1 && STACK[STACK_TOP-1].type == 2 && (STACK[STACK_TOP].type == 1 || STACK[STACK_TOP].type == 2))
apply();
}
if ( expr[i] == '\0' ) /* end of expression */
{
if ( result() == SUCC && STACK_TOP == 0 )
{
data = pop();
if ( data.type == 1 )
printf( "The result is %g\n", data.data.value );
else
printf( "Error : Illegal expression\n" );
}
else
printf( "Error : Illegal expression\n" );
}
else
printf( "Error : Illegal expression\n" );
}
void init( void )
{
STACK_TOP = EMPTY; /* clear stack */
i = 0;
env_num = 0;
top_env = NULL;
struct ENV* env_sin = alloc_env();
strcpy(env_sin->var, "sin");
env_sin->type = 2;
env_sin->value.fun.code = push_sin;
env_sin->next = NULL;
struct ENV* env_pow = alloc_env();
strcpy(env_pow->var, "pow");
env_pow->type = 2;
env_pow->value.fun.code = push_pow;
env_pow->next = env_sin;
top_env = env_pow;
env_sin->value.fun.env = top_env;
env_pow->value.fun.env = top_env;
}
int main( void )
{
char ch;
do
{
init(); /* initialize */
printf( "Please keyin expression to be evaluated \n" );
gets( expr );
calculate();
printf( "Continue (y/n) ? " );
ch = getchar();
} while( !( ch == 'n' || ch == 'N' ) );
return( 0 );
}
LyoKCWV4cHIgLS0+ICggZXhwciApIHwgZXhwciBvcCBleHByIHwgbnVtYmVyIHwgZXhwciBleHByIHwgeAogIHggLS0+IFs6YWxwaGE6XVs6d29yZDpdKgoJb3AgLS0+ICsgfCAtIHwgKiB8IC8KCW51bWJlciAtLT4gaW50ZWdlcgoJaW50ZWdlciAtLT4gaW50ZWdlciBkaWdpdCB8IGRpZ2l0CglkaWdpdCAtLT4gMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCA4IHwgOQoKICBidWlsdC1pbiBmdW5jdGlvbjogcG93IChwb3cgYSBiID0gYV5iKSwgc2luCiovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojZGVmaW5lIFNVQ0MgMAojZGVmaW5lIEZBSUwgMQojZGVmaW5lIFlFUyAwCiNkZWZpbmUgTk8gMQojZGVmaW5lIEVNUFRZIC0xCiNkZWZpbmUgU1RBQ0tfTElNSVQgODAKCnN0cnVjdCBFTlY7CnVuaW9uIGRhdGE7CnN0cnVjdCBmdW5jdGlvbiB7CiAgdm9pZCAoKmNvZGUpKHN0cnVjdCBFTlYqLCB1bmlvbiBkYXRhKTsKICBzdHJ1Y3QgRU5WKiBlbnY7Cn07Cgp0eXBlZGVmIHVuaW9uIGRhdGEgeyBjaGFyIG9wOyBkb3VibGUgdmFsdWU7IHN0cnVjdCBmdW5jdGlvbiBmdW47IH0gREFUQTsKCnR5cGVkZWYgc3RydWN0IHN0YWNrIHsKCWludCB0eXBlOwkJCQkJCQkJLyogMDogb3BlcmF0b3IsIDE6IGRhdGEsIDI6IGZ1bmN0aW9uICovCglEQVRBIGRhdGE7CglpbnQgcHJpb3JpdHk7IH0gU1RBQ0tfREFUQTsKCnN0cnVjdCBzdGFjayBTVEFDS1tTVEFDS19MSU1JVF07CmludCBTVEFDS19UT1AgPSBFTVBUWTsKCmNoYXIgZXhwcls4MF07CmludCBpID0gMDsKCnZvaWQgcHVzaCggU1RBQ0tfREFUQSBkYXRhICkKCnsKICBpZiAoIFNUQUNLX1RPUCA8IFNUQUNLX0xJTUlUIC0gMSApCiAgICBTVEFDS1srK1NUQUNLX1RPUF0gPSBkYXRhOwogIGVsc2UKICB7CiAgICBwcmludGYoICJcblN0YWNrIE92ZXJmbG93ISFcbiIgKTsKICAgIGV4aXQoIDEgKTsKICB9Cn0KClNUQUNLX0RBVEEgcG9wKCB2b2lkICkKCnsKICBpZiAoIFNUQUNLX1RPUCAhPSBFTVBUWSApCiAgICByZXR1cm4oIFNUQUNLW1NUQUNLX1RPUC0tXSApOwogIGVsc2UKICB7CiAgICBwcmludGYoICJcblN0YWNrIFVuZGVyZmxvdyEhXG4iICk7CiAgICBleGl0KCAxICk7CiAgfQp9CgoKCgoKCnN0cnVjdCBFTlYgewogIGNoYXIgdmFyWzE2XTsKICBpbnQgdHlwZTsKICBEQVRBIHZhbHVlOwogIHN0cnVjdCBFTlYgKm5leHQ7Cn07CgpzdHJ1Y3QgRU5WICp0b3BfZW52LCBlbnZfbWVtWzEwMF07CmludCBlbnZfbnVtOwpzdHJ1Y3QgRU5WKiBhbGxvY19lbnYodm9pZCkgewogIGlmIChlbnZfbnVtID09IDEwMCkgewogICAgcHJpbnRmKCJub3QgZW5vdWdoIG1lbW9yeVxuIik7CiAgICBleGl0KDEpOwogIH0KICBzdHJ1Y3QgRU5WKiBlbnYgPSBlbnZfbWVtK2Vudl9udW07CiAgKytlbnZfbnVtOwogIHJldHVybiBlbnY7Cn0KCnN0cnVjdCBFTlYqIGxvb2t1cF9hc3N1bWVfZXhpc3RzKHN0cnVjdCBFTlYqIGN1cnIsIGNvbnN0IGNoYXIqIHZhcikgewogIHdoaWxlIChjdXJyKSB7CiAgICBpZiAoc3RyY21wKHZhciwgY3Vyci0+dmFyKSA9PSAwKQogICAgICByZXR1cm4gY3VycjsKICAgIGN1cnIgPSBjdXJyLT5uZXh0OwogIH0KICBwcmludGYoIlVuYm91bmQgdmFyaWFibGUgJXNcbiIsIHZhcik7CiAgZXhpdCgxKTsKfQoKdm9pZCB2YXJpYWJsZSh2b2lkKSB7CiAgY2hhciB2YXJbMTZdOwogIGludCBrID0gMDsKICB3aGlsZSAoZXhwcltpXSAmJiBpc2FsbnVtKGV4cHJbaV0pKSB7CiAgICB2YXJba10gPSBleHByW2ldOwogICAgKytpOwogICAgKytrOwogIH0KICB2YXJba10gPSAwOwoKICBzdHJ1Y3QgRU5WKiBlbnRyeSA9IGxvb2t1cF9hc3N1bWVfZXhpc3RzKHRvcF9lbnYsIHZhcik7CiAgU1RBQ0tfREFUQSBkYXRhOwogIGRhdGEudHlwZSA9IGVudHJ5LT50eXBlOwogIGRhdGEuZGF0YSA9IGVudHJ5LT52YWx1ZTsKICBkYXRhLnByaW9yaXR5ID0gMDsKICBwdXNoKGRhdGEpOwp9Cgp2b2lkIGFwcGx5KCkgewogIERBVEEgYXJnID0gcG9wKCkuZGF0YTsKICBzdHJ1Y3QgZnVuY3Rpb24gZiA9IHBvcCgpLmRhdGEuZnVuOwogIGYuY29kZShmLmVudiwgYXJnKTsKfQoKdm9pZCBwdXNoX3NpbihzdHJ1Y3QgRU5WKiBlbnZfdW51c2VkLCBEQVRBIGFyZykgewogIFNUQUNLX0RBVEEgZGF0YTsKICBkYXRhLnR5cGUgPSAxOwogIGRhdGEuZGF0YS52YWx1ZSA9IHNpbihhcmcudmFsdWUpOwogIGRhdGEucHJpb3JpdHkgPSAwOwogIHB1c2goZGF0YSk7Cn0KCnZvaWQgcHVzaF9wb3dfaGFzX2Jhc2Uoc3RydWN0IEVOViogZW52LCBEQVRBIGFyZykgewogIFNUQUNLX0RBVEEgZGF0YTsKICBkYXRhLnR5cGUgPSAxOwogIGRhdGEuZGF0YS52YWx1ZSA9IHBvdyhsb29rdXBfYXNzdW1lX2V4aXN0cyhlbnYsICJiYXNlIiktPnZhbHVlLnZhbHVlLCBhcmcudmFsdWUpOwogIGRhdGEucHJpb3JpdHkgPSAwOwogIHB1c2goZGF0YSk7Cn0KCnZvaWQgcHVzaF9wb3coc3RydWN0IEVOViogZW52LCBEQVRBIGFyZykgewogIHN0cnVjdCBFTlYgKmNsID0gYWxsb2NfZW52KCk7CiAgc3RyY3B5KGNsLT52YXIsICJiYXNlIik7CiAgY2wtPnR5cGUgPSAxOwogIGNsLT52YWx1ZS52YWx1ZSA9IGFyZy52YWx1ZTsKICBjbC0+bmV4dCA9IGVudjsKCiAgU1RBQ0tfREFUQSBkYXRhOwogIGRhdGEudHlwZSA9IDI7CiAgZGF0YS5kYXRhLmZ1bi5jb2RlID0gcHVzaF9wb3dfaGFzX2Jhc2U7CiAgZGF0YS5kYXRhLmZ1bi5lbnYgPSBjbDsKICBkYXRhLnByaW9yaXR5ID0gMDsKICBwdXNoKGRhdGEpOwp9CgoKCgoKCgoKaW50IG51bWJlciggdm9pZCApCgp7CglTVEFDS19EQVRBIGRhdGE7CglpbnQgayA9IDAsIG1hbnRpc3NhID0gTk87CgljaGFyIHZhbHVlWzgwXTsKCgl3aGlsZSAoIGV4cHJbaV0gPj0gJzAnICYmIGV4cHJbaV0gPD0gJzknICkJCS8qIGludGVnZXIgKi8KCXsKCQltYW50aXNzYSA9IFlFUzsKCQl2YWx1ZVtrKytdID0gZXhwcltpKytdOwoJfQoKCXZhbHVlW2tdID0gJ1wwJzsKCglkYXRhLnR5cGUgPSAxOwoJZGF0YS5kYXRhLnZhbHVlID0gYXRvZiggdmFsdWUgKTsKCWRhdGEucHJpb3JpdHkgPSAwOwoJcHVzaCggZGF0YSApOwoKCXJldHVybiggU1VDQyApOwp9CgppbnQgZXZhbHVhdGUoIHZvaWQgKQoKewoJU1RBQ0tfREFUQSBkYXRhLCBkYXRhMSwgZGF0YTIsIG9wY29kZTsKCglpZiAoIFNUQUNLX1RPUCA9PSBFTVBUWSApCgkJcmV0dXJuKCBGQUlMICk7CglkYXRhMSA9IHBvcCgpOwoJaWYgKCBkYXRhMS50eXBlICE9IDEgKQoJCXJldHVybiggRkFJTCApOwkJCQkvKiBub3QgYW4gb3BlcmFuZCAqLwoKCWlmICggU1RBQ0tfVE9QID09IEVNUFRZICkKCQlyZXR1cm4oIEZBSUwgKTsKCW9wY29kZSA9IHBvcCgpOwoJaWYgKCBvcGNvZGUudHlwZSAhPSAwICkKCQlyZXR1cm4oIEZBSUwgKTsJCQkJLyogbm90IGFuIG9wZXJhdG9yICovCgoJaWYgKCBTVEFDS19UT1AgPT0gRU1QVFkgKQoJCXJldHVybiggRkFJTCApOwoJZGF0YTIgPSBwb3AoKTsKCWlmICggZGF0YTIudHlwZSAhPSAxICkKCQlyZXR1cm4oIEZBSUwgKTsJCQkJLyogbm90IGFuIG9wZXJhbmQgKi8KCglzd2l0Y2goIG9wY29kZS5kYXRhLm9wICkKCXsKCQljYXNlICcrJyA6IGRhdGEuZGF0YS52YWx1ZSA9IGRhdGEyLmRhdGEudmFsdWUgKyBkYXRhMS5kYXRhLnZhbHVlOwoJCQlicmVhazsKCQljYXNlICctJyA6IGRhdGEuZGF0YS52YWx1ZSA9IGRhdGEyLmRhdGEudmFsdWUgLSBkYXRhMS5kYXRhLnZhbHVlOwoJCQlicmVhazsKCQljYXNlICcqJyA6IGRhdGEuZGF0YS52YWx1ZSA9IGRhdGEyLmRhdGEudmFsdWUgKiBkYXRhMS5kYXRhLnZhbHVlOwoJCQlicmVhazsKCQljYXNlICcvJyA6IGRhdGEuZGF0YS52YWx1ZSA9IGRhdGEyLmRhdGEudmFsdWUgLyBkYXRhMS5kYXRhLnZhbHVlOwoJCQlicmVhazsKCQlkZWZhdWx0OiByZXR1cm4oIEZBSUwgKTsKCQkJYnJlYWs7Cgl9CgoJZGF0YS50eXBlID0gMTsKCWRhdGEucHJpb3JpdHkgPSAwOwoJcHVzaCggZGF0YSApOwoKCXJldHVybiggU1VDQyApOwp9CgppbnQgcmlnaHRfcGFyZW50aGVzaXMoIHZvaWQgKQoKewoJU1RBQ0tfREFUQSBkYXRhOwoKCXdoaWxlICggU1RBQ0tfVE9QICE9IEVNUFRZICkKCXsKCQlpZiAoIFNUQUNLX1RPUC0xICE9IEVNUFRZICYmIFNUQUNLW1NUQUNLX1RPUC0xXS5kYXRhLm9wID09ICcoJyApCgkJewoJCQlpKys7CgkJCWRhdGEgPSBwb3AoKTsKCQkJcG9wKCk7CQkJCQkJCQkvKiByZW1vdmUgbGVmdCBwYXJlbnRoZXNpcyAqLwoJCQlwdXNoKCBkYXRhICk7CgkJCXJldHVybiggU1VDQyApOwoJCX0KCQllbHNlIGlmICggZXZhbHVhdGUoKSA9PSBGQUlMICkKCQkJcmV0dXJuKCBGQUlMICk7Cgl9CgoJcmV0dXJuKCBGQUlMICk7Cn0KCmludCBwYXJlbnRoZXNpcyggdm9pZCApCnsKCVNUQUNLX0RBVEEgZGF0YTsKCglkYXRhLnR5cGUgPSAwOwoJZGF0YS5kYXRhLm9wID0gZXhwcltpKytdOwoJZGF0YS5wcmlvcml0eSA9IDA7CQkJCQkJLyogbGVmdF9wYXJlbnRoZXNpcyAqLwoJcHVzaCggZGF0YSApOwoKCXJldHVybiggU1VDQyApOwp9CgppbnQgb3AoIHZvaWQgKQp7CglTVEFDS19EQVRBIGRhdGE7CgoJc3dpdGNoICggZXhwcltpXSApCgl7CgkJY2FzZSAnKycgOgoJCWNhc2UgJy0nIDogZGF0YS5wcmlvcml0eSA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgJyonIDoKCQljYXNlICcvJyA6IGRhdGEucHJpb3JpdHkgPSAyOwoJCQlicmVhazsKCQlkZWZhdWx0IDoKCQkJcmV0dXJuKCBGQUlMICk7Cgl9CgoJd2hpbGUgKCBTVEFDS19UT1AgPiAwICYmIGRhdGEucHJpb3JpdHkgPD0gU1RBQ0tbU1RBQ0tfVE9QLTFdLnByaW9yaXR5ICkKCXsKCQlpZiAoIGV2YWx1YXRlKCkgPT0gRkFJTCApCgkJCXJldHVybiggRkFJTCApOwoJfQoKCWRhdGEudHlwZSA9IDA7CglkYXRhLmRhdGEub3AgPSBleHByW2krK107CglwdXNoKCBkYXRhICk7CgoJcmV0dXJuKCBTVUNDICk7Cn0KCmludCBleHByZXNzaW9uKCB2b2lkICkKewoJd2hpbGUgKCBleHByW2ldID09ICcgJyApCQkJCS8qIHNraXAgdGhlIGxlYWRpbmcgc3BhY2VzICovCgkJaSsrOwoKICBpZiAoIGV4cHJbaV0gPT0gJygnICkKIAkJcmV0dXJuKCBwYXJlbnRoZXNpcygpICk7CQkJLyogKCBleHByKSAqLwoKICBpZiAoIGV4cHJbaV0gPT0gJysnIHx8IGV4cHJbaV0gPT0gJy0nIHx8IGV4cHJbaV0gPT0gJyonIHx8IGV4cHJbaV0gPT0gJy8nICkKCQlyZXR1cm4oIG9wKCkgKTsJCQkJCQkvKiBleHByIG9wIGV4cHIgKi8KCglpZiAoIGV4cHJbaV0gPj0gJzAnICYmIGV4cHJbaV0gPD0gJzknCSkKCQlyZXR1cm4oIG51bWJlcigpICk7CQkJCQkvKiBudW1iZXIgKi8KCglpZiAoIGV4cHJbaV0gPT0gJyknKQkJCQkJLyogZW5kIG9mIHBhcmVudGhlc2lzICovCgkJcmV0dXJuKCByaWdodF9wYXJlbnRoZXNpcygpICk7CgogIGlmIChpc2FscGhhKGV4cHJbaV0pKSB7CiAgICB2YXJpYWJsZSgpOwogICAgcmV0dXJuIFNVQ0M7CiAgfQoKCWlmICggZXhwcltpXSA9PSAnXDAnKQkJCQkJLyogZW5kIG9mIGV4cHJlc3Npb24gKi8KCQlyZXR1cm4oIFNVQ0MgKTsKCWVsc2UKCQlyZXR1cm4oIEZBSUwgKTsKfQoKaW50IHJlc3VsdCggdm9pZCApCgp7Cgl3aGlsZSAoIFNUQUNLX1RPUCA+IDAgKQoJewoJCWlmICggZXZhbHVhdGUoKSA9PSBGQUlMICkKCQkJcmV0dXJuKCBGQUlMICk7Cgl9CgoJcmV0dXJuKCBTVUNDICk7Cn0KCnZvaWQgY2FsY3VsYXRlKCB2b2lkICkKewoJU1RBQ0tfREFUQSBkYXRhOwoKCXdoaWxlICggZXhwcltpXSAhPSAnXDAnICkKCXsKCQlpZiAoIGV4cHJlc3Npb24oKSA9PSBGQUlMICkJCS8qIHBhcnNlIHRoZSBleHNwcmVzc2lvbiAqLwoJCQlicmVhazsKICAgIGlmIChTVEFDS19UT1AgPj0gMSAmJiBTVEFDS1tTVEFDS19UT1AtMV0udHlwZSA9PSAyICYmIChTVEFDS1tTVEFDS19UT1BdLnR5cGUgPT0gMSB8fCBTVEFDS1tTVEFDS19UT1BdLnR5cGUgPT0gMikpCiAgICAgIGFwcGx5KCk7Cgl9CgoJaWYgKCBleHByW2ldID09ICdcMCcgKQkvKiBlbmQgb2YgZXhwcmVzc2lvbiAqLwogICAgewoJCWlmICggcmVzdWx0KCkgPT0gU1VDQyAmJiBTVEFDS19UT1AgPT0gMCApCgkJewoJCQlkYXRhID0gcG9wKCk7CgkJCWlmICggZGF0YS50eXBlID09IDEgKQoJCQkJcHJpbnRmKCAiVGhlIHJlc3VsdCBpcyAlZ1xuIiwgZGF0YS5kYXRhLnZhbHVlICk7CgkJCWVsc2UKCQkJCXByaW50ZiggIkVycm9yIDogSWxsZWdhbCBleHByZXNzaW9uXG4iICk7CiAJCX0KCQllbHNlCgkJCXByaW50ZiggIkVycm9yIDogSWxsZWdhbCBleHByZXNzaW9uXG4iICk7CiAgICB9CgllbHNlCgkJcHJpbnRmKCAiRXJyb3IgOiBJbGxlZ2FsIGV4cHJlc3Npb25cbiIgKTsKfQoKdm9pZCBpbml0KCB2b2lkICkKewoJU1RBQ0tfVE9QID0gRU1QVFk7ICAgLyogY2xlYXIgc3RhY2sgKi8KCWkgPSAwOwoKCgoKCiAgZW52X251bSA9IDA7CgogIHRvcF9lbnYgPSBOVUxMOwogIHN0cnVjdCBFTlYqIGVudl9zaW4gPSBhbGxvY19lbnYoKTsKICBzdHJjcHkoZW52X3Npbi0+dmFyLCAic2luIik7CiAgZW52X3Npbi0+dHlwZSA9IDI7CiAgZW52X3Npbi0+dmFsdWUuZnVuLmNvZGUgPSBwdXNoX3NpbjsKICBlbnZfc2luLT5uZXh0ID0gTlVMTDsKCiAgc3RydWN0IEVOViogZW52X3BvdyA9IGFsbG9jX2VudigpOwogIHN0cmNweShlbnZfcG93LT52YXIsICJwb3ciKTsKICBlbnZfcG93LT50eXBlID0gMjsKICBlbnZfcG93LT52YWx1ZS5mdW4uY29kZSA9IHB1c2hfcG93OwogIGVudl9wb3ctPm5leHQgPSBlbnZfc2luOwoKICB0b3BfZW52ID0gZW52X3BvdzsKICBlbnZfc2luLT52YWx1ZS5mdW4uZW52ID0gdG9wX2VudjsKICBlbnZfcG93LT52YWx1ZS5mdW4uZW52ID0gdG9wX2VudjsKfQoKaW50IG1haW4oIHZvaWQgKQp7CgljaGFyIGNoOwoKCWRvCgl7CgkJaW5pdCgpOwkJCQkvKiBpbml0aWFsaXplICovCgoJCXByaW50ZiggIlBsZWFzZSBrZXlpbiBleHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZCBcbiIgKTsKCQlnZXRzKCBleHByICk7CgoJCWNhbGN1bGF0ZSgpOwoKCQlwcmludGYoICJDb250aW51ZSAoeS9uKSA/ICIgKTsKCQljaCA9IGdldGNoYXIoKTsKCX0gd2hpbGUoICEoIGNoID09ICduJyB8fCBjaCA9PSAnTicgKSApOwoKCXJldHVybiggMCApOwp9Cg==
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