Go: package main

import (
	"bufio"
	"fmt"
	"os"
)

var sc = bufio.NewScanner(os.Stdin)

func nextString() string {
	sc.Scan()
	return sc.Text()
}

func main() {
	sc.Buffer(make([]byte, 0), 1000000009)

	for {
		var s string
		s = nextString()
		if s == "." {
			break
		}
		var st []byte
		is_valid := true

		for _, value := range s {
			if value == '(' {
				st = append(st, byte(value))
			}
			if value == '[' {
				st = append(st, byte(value))
			}
			if value == ')' {
				if len(st) == 0 || st[len(st)-1] != '(' {
					is_valid = false
					break
				} else {
					st = st[:len(st)-1]
				}
			}
			if value == ']' {
				if len(st) == 0 || st[len(st)-1] != '[' {
					is_valid = false
					break
				} else {
					st = st[:len(st)-1]
				}
			}
		}
		if len(st) != 0 {
			is_valid = false
		}
		if is_valid {
			fmt.Println("yes")
		} else {
			fmt.Println("no")
		}
	}
}

C++: #include <algorithm>
#include <cstdio>
#include <iostream>
#include <queue>
#include <stack>
#include <utility>
#include <iomanip>
#include <cassert>
using namespace std;

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    while(true){
        string s;
        getline(cin, s);
        if(s[0] == '.') break;
        int len = s.size();
        int rb = 0, sb = 0;
        bool ok = true;
        stack<char> left_br;
        for(int i = 0; i < len; i++){
            if(s[i] == '('){
                left_br.push('(');
            }else if(s[i] == ')'){
                if(left_br.empty() || left_br.top() != '('){
                    ok = false;
                    break;
                }
                left_br.pop();
            }else if(s[i] == '['){
                left_br.push('[');
            }else if(s[i] == ']'){
                if(left_br.empty() || left_br.top() != '['){
                    ok = false;
                    break;
                }
                left_br.pop();
            }
        }
        if(ok){
            puts("yes");
        }else{
            puts("no");
        }
    }
    return 0;
}

C++: #include <iostream>
#include <stack>
using namespace std;

bool solve(string &s) {
  stack<int> st;
  for(int i = 0; i < (int)s.length(); ++i) {
    if(s[i] == '[') {
      st.push(1);
    }
    if(s[i] == '(') {
      st.push(2);
    }
    if(s[i] == ']') {
      if(st.top() != 1) return 0;
      st.pop();
    }
    if(s[i] == ')') {
      if(st.top() != 2) return 0;
      st.pop();
    }
  }
  return st.empty();
}

int main() {
  string s;
  while(getline(cin, s)) {
    if(s == ".") break;
    cout << (solve(s) ? "yes" : "no") << endl;
  }
  return 0;
}

C++: #include <iostream>
#include <stdio.h>
#include <stack>
#include <string>
using namespace std;
 
int main() {
    while (true) {
        char s[101];
        int c;
        int j = 0;
        while (true) {
            c = getchar();
            if (c == '\n') break;
            s[j++] = c;
        }
        s[j] = '\0';
        if (s[0] == '.') return 0;
         
        stack<char> stk;
        for (int i = 0; s[i] != '\0'; i++) {
            if (s[i] == '(') stk.push('(');
            else if (s[i] == '[') stk.push('[');
            else if (s[i] == ')') {
                if (!stk.empty()) {
                    if (stk.top() == '(') stk.pop();
                    else stk.push(')');
                } else stk.push(')');
            } else if (s[i] == ']') {
                if (!stk.empty()) {
                    if (stk.top() == '[') stk.pop();
                    else stk.push(']');
                } else stk.push(']');
            }
        }
         
        if (stk.empty()) cout << "yes" << endl;
        else cout << "no" << endl;
    }
}

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

int main(){
  string str;

  while(getline(cin,str), str!="."){
    stack<char> s;

    bool f = true;
    for(int i=0;f && (i<(int)str.size());i++){
      if(str[i] == '(' || str[i] == '[')s.push(str[i]);
      else if(str[i] == ')'){
	if(s.empty() || s.top() != '(')f = false;
	else s.pop();
      }else if(str[i] == ']'){
	if(s.empty() || s.top() != '[')f = false;
	else s.pop();
      }
    }
    
    if(f && s.empty())cout << "yes" << endl;
    else cout << "no" << endl;
  }
}

C++: #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double EPS=1e-10;
const ll INF=1000000000;
int main(){
    string s;
    while(1){
        getline(cin,s);
        if(s=="."){
            break;
        }
        stack<char> st;
        bool f=true;
        for(int i=0;i<s.size();i++){
            if(s[i]=='('||s[i]=='['){
                st.push(s[i]);
            }else if(s[i]==')'){
                if(st.empty()){
                    f=false;
                    break;
                }
                if(st.top()=='('){
                    st.pop();
                }else{
                    f=false;
                    break;
                }
            }else if(s[i]==']'){
                if(st.empty()){
                    f=false;
                    break;
                }
                if(st.top()=='['){
                    st.pop();
                }else{
                    f=false;
                    break;
                }
            }
        }
        if(!st.empty()){
            f=false;
        }
        if(f){
            cout<<"yes"<<endl;
        }else{
            cout<<"no"<<endl;
        }
    }
    return 0;
}

C++: #include <iostream>
#include <stack>
using namespace std;

int main(){
  string s;
  while(getline(cin,s)){
    stack<char> st;
    if(s[0]=='.'break;
    bool ch=false;
    int i;
    for(i=0;i<s.size();i++){
      if(s[i]=='[' || s[i]=='(')st.push(s[i]);
      else if(s[i]==']'){
        if(st.empty() || st.top()!='[')ch=true;
        else if(!st.empty()) st.pop();
      }else if(s[i]==')'){
        if(st.empty() || st.top()!='(')ch=true;
        else if(!st.empty()) st.pop();
      }
    }
    if(ch)cout << "no" << endl;
    else cout << "yes" << endl;
  }
  return 0;
}

C++: #include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
  string s;
  int i;
  bool f;
  while(getline(cin,s),s[0]!='.'){
    stack<char> st;
    f=true;
    for(i=0;i<s.size();i++){
      if(s[i]=='('||s[i]=='['){
	st.push(s[i]);
      }else if(s[i]==')'||s[i]==']'){
	if(!st.empty()&&(st.top()+1==s[i]||st.top()+2==s[i]))st.pop();
	else f=false;
      }
    }
    puts(f&&st.empty()?"yes":"no");
  }
}

C++: #include <iostream>
using namespace std;

int N;

bool balance(string s, int b, int e)
{
  N = 1;
  for(int i = b; i < e; i++){
    if(s.at(i) == '('){
      for(int j = i + 1; j < e; j++){
	if(s.at(j) == ')'){
	  string sub = s.substr(i + 1, j - i - 1);
	  if(balance(sub, 0, sub.size())){
	    N = 0;
	    continue;
	  }
	}
      }
      if(N)
	return false;
      else
	return true;
    }else if(s.at(i) == '['){
      for(int j = i + 1; j < e; j++){
	if(s.at(j) == ']'){
	  string sub = s.substr(i + 1, j - i - 1);
      	  if(balance(sub, 0, sub.size())){
	    N = 0;
	    continue;
	  }
	}
      }
      if(N)
	return false;
      else
	return true;
    }else if(s.at(i) == ')'){
      for(int j = 0; j < i; j++){
	if(s.at(j) == '('){
	  string sub = s.substr(j + 1, i - j - 1);
	  if(balance(sub, 0, sub.size())){
	    N = 0;
	    continue;
	  }
	}
      }
      if(N)
	return false;
      else
	return true;
    }else if(s.at(i) == ']'){
      for(int j = 0; j < i; j++){
	if(s.at(j) == '['){
	  string sub = s.substr(j + 1, i - j - 1);
	  if(balance(sub, 0, sub.size())){
	    N = 0;
	    continue;
	  }
	}
      }
      if(N)
	return false;
      else
	return true;
    }
  }
  return true;
}
       
int main()
{
  string s;
  while(getline(cin, s)){
    if(balance(s, 0, s.size()))
      cout << "yes" << endl;
    else
      cout << "no" << endl;
  }
}