/* Обработка выражения в присваивании */ 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); }
/* 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); }
/* Process parenthesized expression. */ void eval_exp5(int *value) { if((*token == '(')) { get_token(); eval_exp0(value); /* get subexpression */ if(*token != ')') sntx_err(PAREN_EXPECTED); get_token(); } else atom(value); }
/* Обработка выражения в скобках. */ void eval_exp5(int *value) { if(*token == '(') { get_token(); eval_exp0(value); /* вычисление подвыражения */ if(*token != ')') { sntx_err(PAREN_EXPECTED); } get_token(); } else { atom(value); } }
/* Точка входа для вычисления выражение в синтаксическом дереве */ void eval_exp(int *value) { get_token(); if(!*token) { sntx_err(NO_EXP); return; } if(*token == ';') { *value = 0; /* пустое выражение */ return; } eval_exp0(value); putback(); /* возврат последней лексемы во входной поток */ }
/* Entry point into parser. */ void eval_exp(int *value) { get_token(); if(!*token) { sntx_err(NO_EXP); return; } if(*token==';') { *value = 0; /* empty expression */ return; } eval_exp0(value); putback(); /* return last token read to input stream */ }
void eval_exp(int *value) { get_token(); if(!*token) { sntx_err(NO_EXP); return; } if(*token==';') { *value = 0; return; } eval_exp0(value); putback(); }
// Process parenthesized expression. void eval_exp5(int &value) { if ((*token == '(')) { get_token(); eval_exp0(value); // get subexpression if (*token != ')') throw InterpExc(PAREN_EXPECTED); get_token(); } else atom(value); }
void eval_exp(int &value) { get_token(); if(!*token) { throw InterpExc(NO_EXP); } if (*token == ';') { value = 0; return; } eval_exp0(value); putback(); }