#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>

#include <complex>
#include <regex>

#include <functional>
#include <cassert>

typedef long long ll;
using namespace std;

#define debug(x) cerr << #x << " = " << (x) << endl;


#define mod 1000000007 //1e9+7(prime number)
#define INF 1000000000 //1e9
#define LLINF 2000000000000000000LL //2e18
#define SIZE 100010

typedef double P_type;
typedef complex<P_type> P;

//??????
double dot(P a, P b) {
  return (a * conj(b)).real();
}

//??????
double cross(P a, P b) {
  return (a * conj(b)).imag();
}

P getCrosspointLL(P a1, P a2, P b1, P b2) {
  P a = a2 - a1;
  P b = b2 - b1;
  return a1 + a * cross(b, b1-a1) / cross(b, a);
}

P getProject(P a1, P a2, P p){
  P base = a2 - a1;
  double r = dot(p - a1, base) / (abs(base) * abs(base));
  return a1 + base * r;
}

P getReflection(P a1, P a2, P p){
  return p + (getProject(a1, a2, p) - p) * 2.0;
}

struct Line{
  double a,b,c,d;

  Line(double a, double b, double c, double d):a(a),b(b),c(c),d(d){}
  Line(){}
};

void solve(string s){
  vector<Line> lines;
  string prevs = "";
  
  while(prevs != s){
    prevs = s;
    s = regex_replace(s, regex("\\(\\(([^()]+)\\)\\)"),"($1)");

    if(s != prevs) continue;
    
    //debug(s);

    match_results<string::const_iterator> mr1, mr2, mr3, mr4;
    int minpos = INF;
    auto r1 = regex("\\(([0-9.-]+),([0-9.-]+)\\)@\\(([0-9.-]+),([0-9.-]+)\\)");
    auto r2 = regex("\\(L(\\d+)\\)@\\(L(\\d+)\\)");
    auto r3 = regex("\\(([0-9.-]+),([0-9.-]+)\\)@\\(L(\\d+)\\)");
    auto r4 = regex("\\(L(\\d+)\\)@\\(([0-9.-]+),([0-9.-]+)\\)");
    bool f1 = regex_search(s, mr1, r1);
    bool f2 = regex_search(s, mr2, r2);
    bool f3 = regex_search(s, mr3, r3);
    bool f4 = regex_search(s, mr4, r4);

    if(f1) minpos = min(minpos, (int)mr1.position(0));
    if(f2) minpos = min(minpos, (int)mr2.position(0));
    if(f3) minpos = min(minpos, (int)mr3.position(0));
    if(f4) minpos = min(minpos, (int)mr4.position(0));
    
    if(f1 && minpos == mr1.position(0)){
      double a = stod(mr1[1]);
      double b = stod(mr1[2]);
      double c = stod(mr1[3]);
      double d = stod(mr1[4]);

      lines.push_back(Line(a,b,c,d));

      s = regex_replace(s, r1,"(L"+to_string(lines.size()-1)+")", regex_constants::format_first_only);
      continue;
    }

    if(f2 && minpos == mr2.position(0)){
      int p = stoi(mr2[1]);
      int q = stoi(mr2[2]);

      auto c = getCrosspointLL(P(lines[p].a, lines[p].b),P(lines[p].c, lines[p].d),
                               P(lines[q].a, lines[q].b),P(lines[q].c, lines[q].d));

      s = regex_replace(s, r2,"("+to_string(c.real())+","+to_string(c.imag())+")",regex_constants::format_first_only);
      continue;
    }

    if(f3 && minpos == mr3.position(0)){
      double a = stod(mr3[1]);
      double b = stod(mr3[2]);
      int p = stoi(mr3[3]);

      auto c = getReflection(P(lines[p].a, lines[p].b),P(lines[p].c, lines[p].d),P(a,b));

      s = regex_replace(s, r3, "("+to_string(c.real())+","+to_string(c.imag())+")",regex_constants::format_first_only);
      continue;
    }

    if(f4 && minpos == mr4.position(0)){
      double a = stod(mr4[2]);
      double b = stod(mr4[3]);
      int p = stoi(mr4[1]);

      auto c = getReflection(P(lines[p].a, lines[p].b),P(lines[p].c, lines[p].d),P(a,b));

      s = regex_replace(s, r4, "("+to_string(c.real())+","+to_string(c.imag())+")",regex_constants::format_first_only);
      continue;
    }
  }

  cout << regex_replace(s, regex("\\((.+),(.+)\\)"),"$1 $2") << endl;
}

int main(){
  string s;
  
  while(1){
    cin >> s;
    if(s[0] == '#') break;
    solve(s);
  }
  
  return 0;
}

Measured memory_bytes: 3364