Here is a grammar

 expr:           factor expr_tail
 expr_tail:         EMPTY | "+" factor expr_tail | "-" factor expr_tail
 factor:         term factor_tail
 factor_tail:       EMPTY | "*" term factor_tail | "/" term factor_tail
 term:           NUM | "(" expr ")"

Here is a recursive descent pseudo-code for it

 process()
  push("empty line")
  expr()
  pop()

 expr()
  factor()
  expr_tail()

 expr_tail()
  if EMPTY return
  next-element = consume next element
  if next-element is '+
 	begin
 		factor()
 		x = pop()
 		y = pop()
 		push(x+y)
 		expr_tail()
 	end
  elseif next-element is '-
 	begin
 		factor()
 		x = pop()
 		y = pop()
 		push(y-x)    (note: y is the first operand)
 		expr_tail()
 	end





 factor()
  term()
  factor_tail()



 factor_tail()
  if EMPTY return
  next-element = consume next element
  if next-element is '*
 	begin
 		term()
 		x = pop()
 		y = pop()
 		push(x*y)
 		factor_tail()
 	end
  elseif next-element is '/
 	begin
 		factor()
 		x = pop()
 		y = pop()
 		push(y/x)        (note: y is the first operand)
 		factor_tail()
 	end
  #else return


 term()
  next-element = consume next element (hint:. (car input))
  if next-element is a num (hint: (number? input))
 	push NUM
  elseif next-element is a list (hint: (list? input))
 	expr()