/* Process an assignment expression */ void eval_exp0(int *value) { char temp[ID_LEN]; /* holds name of var receiving the assignment */ register int temp_tok; if(token_type==IDENTIFIER) { if(is_var(token)) { /* if a var, see if assignment */ strcpy(temp, token); temp_tok = token_type; get_token(); if(*token=='=') { /* is an assignment */ get_token(); eval_exp0(value); /* get value to assign */ assign_var(temp, *value); /* assign the value */ return; } else { /* not an assignment */ putback(); /* restore original token */ strcpy(token, temp); token_type = temp_tok; } } } eval_exp1(value); }
void eval_exp0(int &value) { char temp[MAX_ID_LEN + 1]; tok_types temp_tok; if (token_type == IDENTIFIER) { if (is_var(token)) { strcpy(temp, token); temp_tok = token_type; get_token(); if (*token == '=') { get_token(); eval_exp0(value); assign_var(temp, value); return; } else { putback(); strcpy(token, temp); token_type = temp_tok; } } } eval_exp1(value); }
/* Ponto de entrada do analisador */ void Parser::eval_exp(double *answer) { get_token(); if (!*token) { serror(2); return; } eval_exp1(answer); }
/* Обработка выражения в присваивании */ void eval_exp0(int *value) { char temp[ID_LEN]; /* содержит имя переменной, которой присваивается значение */ register int temp_tok; if(token_type == IDENTIFIER) { if(is_var(token)) { /* если эта переменная, посмотреть, присваивается ли ей значение */ if(is_arr(token)) { sntx_err(SYNTAX); // todo: make message: redefinition of array is illegal } strcpy(temp, token); temp_tok = token_type; get_token(); if(*token == '=') { /* это присваивание */ get_token(); eval_exp0(value); /* вычислить присваемое значение */ assign_var(temp, *value); /* присвоить значение */ return; } else { /* не присваивание */ putback(); /* востановление лексемы */ strcpy(token, temp); token_type = temp_tok; } } else if(is_arr(token)) { strcpy(temp, token); temp_tok = token_type; get_token(); if(*token == '[') { get_token(); eval_exp0(value); // вычисление выражения в [] скобках int arr_index = *value; get_token(); // '=' or ';' if(*token == '=') { /* это присваивание */ get_token(); eval_exp0(value); /* вычислить присваемое значение */ assign_arr_element(temp, arr_index, *value); /* присвоить значение */ return; } else { /* не присваивание */ putback(); /* востановление лексемы */ strcpy(token, temp); token_type = temp_tok; } } else { sntx_err(ASSIGN_ARRAY_ILLEGAL); } } } eval_exp1(value); }