#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define repr(i,n) for(int i=(int)(n-1);i>=0;i--)
#define rep(i,n) repl(i,0,n)
#define each(itr,v) for(auto itr:v)
#define pb(s) push_back(s)
#define all(x) (x).begin(),(x).end()
#define dbg(x) cout << #x" = " << x << endl
#define print(x) cout << x << endl
#define maxch(x,y) x=max(x,y)
#define minch(x,y) x=min(x,y)
#define uni(x) x.erase(unique(all(x)),x.end())
#define exist(x,y) (find(all(x),y)!=x.end())
#define bcnt(x) bitset<32>(x).count()

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
typedef pair<P, int> PPI;
typedef pair<int, P> PIP;
typedef pair<ll, ll> PL;
typedef pair<P, ll> PPL;
typedef set<int> S;

#define INF INT_MAX/3
#define MAX_N 1000000001

string dfs(string s) {
  string ss = "", tmp;
  int i = 0;
  while(i < s.length()) {
    if (s[i] == '[') {
      int flag = 1, j = i;
      while(j < s.length() && flag != 0) {
        j++;
        if (s[j] == '[') flag++;
        else if (s[j] == ']') flag--;
      }

      tmp = dfs(s.substr(i + 1, j - i - 1));
      reverse(all(tmp));
      ss += tmp;
      i = j;
    } else if (s[i] == '+' || s[i] == '-') {
      int flag = 0, j = i;
      while(j < s.length() && s[j] == '+' || s[j] == '-') {
        if (s[j] == '+') flag++;
        else if (s[j] == '-') flag--;
        j++;
      }

      if (s[j] == '?') ss += 'A';
      else ss += (char)((s[j] - 'A' + flag + 104) % 26 + 'A');
      i = j;
    } else {
      if (s[i] == '?') ss += 'A';
      else ss += s[i];
    }

    i++;
  }

  return ss;
}


int main(){
  cin.sync_with_stdio(false);
  string s;
  while(cin >> s, s[0] != '.') {
    cout << dfs(s) << endl;
  }

  return 0;
}