static int do_expr( void ) { long arg1; long arg2; int op; if( not_ok == pop_op( &op ) ) { return( not_ok ); } if( not_ok == pop_val( &arg1 ) ) { return( not_ok ); } pop_val( &arg2 ); switch( op ) { case '+': push_val( arg2 + arg1 ); break; case '-': push_val( arg2 - arg1 ); break; case '*': push_val( arg2 * arg1 ); break; case '/': if( 0 == arg1 ) { return( not_ok ); } push_val( arg2 / arg1 ); break; case '(': cvalue += 2; break; default: return( not_ok ); } if( 1 > cvalue ) { return( not_ok ); } else { return( op ); } }
LFUNC bool get_next_dfs_val(tval_list *l, tnode *y,tvalue *v) { tvalue child,x ; tval_list newl ; newl.head=0 ; do { if(!pop_val(l,v)) return(FALSE) ; x= *v ; duel_get_struct_ptr_val(&x,"x-->y"); } while(x.u.lvalue==0) ; /* ignore null pointers */ while(eval_dot(y,&child,"-->",v,&x)) { set_search_symb_val("-->",&x,&child); /* makes x-->y[n] neatly */ append_val(&newl,&child); /* append to childs list */ } push_val_list(l,&newl); /* append new childs to stack */ return(TRUE); /* returns the popped value in v */ }
static int evaluate( char * * line, long *val ) { long arg; char * ptr; char * str; char * endptr; int ercode; operator * op; int expr_oper; // looking for term or operator expr_oper = 0; coper = 0; cvalue = 0; nparens = 0; ptr = *line; while( *ptr ) { if( *ptr == ' ' ) { if( ignore_blanks ) { ptr++; continue; } else { break; } } switch( expr_oper ) { case 0: // look for term str = get_exp( ptr ); if( str == NULL ) { // nothing is error return( not_ok ); } op = get_op( str ); if( *(str +1) == NULC ) { if( NULL != op ) { push_op( op->operc ); ptr++; break; } if( (*str == '-' ) || (*str == '+' ) ) { push_op(*str); ++ptr; break; } } arg = strtol( str, &endptr, 10 ); if( (((arg == LONG_MIN) || (arg == LONG_MAX)) && errno == ERANGE) || (str == endptr) ) { return( not_ok ); } push_val( arg ); ptr += endptr - str; // to the next unprocessed char expr_oper = 1; // look for operator next break; case 1: // look for operator op = get_op( ptr ); if( NULL == op ) { return( not_ok ); } if( ')' == *ptr ) { ercode = do_paren(); if( ok > ercode ) { return( ercode ); } } else { while( coper && op->priority <= get_prio_m1() ) { do_expr(); } push_op( op->operc ); expr_oper = 0; // look for term next } ptr++; break; } } while( 1 < cvalue ) { ercode = do_expr(); if( ok > ercode ) return ercode; } if( !coper ) { *line = ptr; // next scan position return( pop_val( val ) ); // no operations left return result } else { return( not_ok ); } }
void CAssembler::arg_cache_op(uint32_t* opcode) { *opcode |= (pop_val() & 0x1F) << 16; }
void CAssembler::arg_syscall_code(uint32_t* opcode) { *opcode |= (pop_val() & 0xFFFFF) << 6; }
void CAssembler::arg_shamt(uint32_t* opcode) { *opcode |= (pop_val() & 0x1F) << 6; }
void CAssembler::arg_bra_target(uint32_t* opcode) { uint16_t relTarget = (((pop_val() - m_Address) / 4) & 0xFFFF) - 1; *opcode |= relTarget; }
void CAssembler::arg_imm16(uint32_t* opcode) { *opcode |= (pop_val() & 0xFFFF); }
void CAssembler::arg_jump(uint32_t* opcode) { *opcode |= (pop_val() / 4) & 0x3FFFFFF; }
/* Calcola e restituisce il risultato di un'espressione in forma infissa */ double EvalInfix(const char *strExpression, char * strError) { Token tok; Token tok_temp; double left, right; double dblRet; strcpy(strError, ""); tok_temp.Type = EOL; tok_temp.str[0] = '@'; tok_temp.str[1] = '\0'; push_op(tok_temp, strError); if ( strError[0] != '\0' ) return 0.0; left = right = 0.0; while ( (PreviousTokenType = GetNextToken(strExpression, &tok, TRUE)) != EOL ) { if ( tok.Type == UNKNOWN ) { sprintf(strError, "Error: invalid token: %s\n", tok.str); return 0.0; } else if ( tok.Type == VALUE ) { push_val(tok.Value, strError); if ( strError[0] != '\0' ) return 0.0; } else if ( tok.Type == OPAREN || tok.Type == UMINUS || tok.Type == UPLUS ) { push_op(tok, strError); if ( strError[0] != '\0' ) return 0.0; } else if ( tok.Type == CPAREN ) { while ( top_op(strError).Type != OPAREN ) { if ( strError[0] != '\0' ) return 0.0; tok_temp = pop_op(strError); if ( strError[0] != '\0' ) return 0.0; if ( (tok_temp.Type == EOL) || (is_empty_op()) ) { sprintf(strError, "Error: unbalanced brackets.\n"); return 0.0; } right = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; if ( tok_temp.Type != UMINUS ) { left = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; dblRet = BinaryOperation(left, right, tok_temp.str[0], strError); if ( strError[0] != '\0' ) return 0.0; push_val(dblRet, strError); if ( strError[0] != '\0' ) return 0.0; } else { push_val( -1 * right, strError ); if ( strError[0] != '\0' ) return 0.0; } } pop_op(strError); if ( strError[0] != '\0' ) return 0.0; } else { while ( PREC_TABLE[ top_op(strError).Type ].topOfStack >= PREC_TABLE[ tok.Type ].inputSymbol ) { if ( strError[0] != '\0' ) return 0.0; if ( top_op(strError).Type != UMINUS && top_op(strError).Type != UPLUS ) { if ( strError[0] != '\0' ) return 0.0; right = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; left = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; tok_temp = pop_op(strError); if ( strError[0] != '\0' ) return 0.0; dblRet = BinaryOperation(left, right, tok_temp.str[0], strError); if ( strError[0] != '\0' ) return 0.0; push_val(dblRet, strError); if ( strError[0] != '\0' ) return 0.0; } else { if ( top_op(strError).Type == UMINUS ) { if ( strError[0] != '\0' ) return 0.0; right = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; pop_op(strError); if ( strError[0] != '\0' ) return 0.0; push_val(-1 * right, strError); if ( strError[0] != '\0' ) return 0.0; } else { pop_op(strError); if ( strError[0] != '\0' ) return 0.0; } } } if ( tok.Type != EOL ) { push_op(tok, strError); if ( strError[0] != '\0' ) return 0.0; } } } while ( 1 ) { tok_temp = pop_op(strError); if ( strError[0] != '\0' ) return 0.0; if ( tok_temp.Type == EOL ) break; if ( tok_temp.Type != UPLUS ) { right = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; } if ( tok_temp.Type != UMINUS && tok_temp.Type != UPLUS ) { left = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; dblRet = BinaryOperation(left, right, tok_temp.str[0], strError); if ( strError[0] != '\0' ) return 0.0; push_val(dblRet, strError); if ( strError[0] != '\0' ) return 0.0; } else { push_val( -1 * right, strError ); if ( strError[0] != '\0' ) return 0.0; } } dblRet = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; if ( is_empty_val() ) { return dblRet; } else { sprintf(strError, "Error: malformed expression.\n"); return 0.0; } }