private void AddVarToVarTable(string varName, ZOperand zOperand) {
     if (varTable.Peek().ContainsKey(varName)) throw new Exception("variable " + varName + " can't have duplicate definition");
     varTable.Peek()[varName] = zOperand;
 }
        private ZOperand Compute(ZOperand left, string oper, ZOperand right = null) {
              //very important
            Operand resultValue = null;
            resultValue = right == null ? Compute(left.Operand, oper, null) : Compute(left.Operand, oper, right.Operand);

            if (resultValue == null) throw new Exception("invaild expression");
            else {
                return new ZOperand(resultValue, getTypeString(resultValue.GetReturnType(tm)));
            }
        }