#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

const int INF = 1e+8;

// 変数 'a' - 'k' を value に置き換え
void change(string& s, char x, char value){
  for(int i=0 ; i < s.size() ; i++ ){
    if( s[i] == x ) s[i] = value;
  }
}

// 式から "--" の除去
void minus_erase(string& s){
  for(int i=1 ; i < s.size() ; i++ ){
    if( s[i-1] == '-' && s[i] == '-' ){
      s.erase( i-1 , 2 );
      i = 0;
    }
  }
}

// 論理否定の計算 ("-F" => "T", "-T" => "F" の 文字列置換)
void minus_calc(string& s){
  for(int i=1 ; i < s.size() ; i++ ){
    if( s[i-1] == '-' && s[i] == 'F' ){
      s.replace( i-1 , 2 , "T" );
      i = 0;
    }else if( s[i-1] == '-' && s[i] == 'T' ){
      s.replace( i-1 , 2 , "F" );
      i = 0;
    }
  }
}

// 論理和, 論理積, 論理包含の計算 (文字列置換)
void calc(string& s){
  string ex[12] = {
    "(F+F)", "(F+T)", "(T+F)", "(T+T)",
    "(F*F)", "(F*T)", "(T*F)", "(T*T)",
    "(F>F)", "(F>T)", "(T>F)", "(T>T)"
  };
  string result[12] = {
    "F", "T", "T", "T",
    "F", "F", "F", "T",
    "T", "T", "F", "T"
  };
  for(int i=0 ; i+4 < s.size() ; i++ ){
    for(int j=0 ; j < 12 ; j++ ){
      if( s.substr(i,5) == ex[j] ){
        s.replace( i , 5 , result[j] );
        i = -1;
        break;
      }
    }
  }
}

int main(){
  string ex;
  while( cin >> ex ){
    if( ex == "#" ) break;
    
    // "->" を ">" に置き換えておく
    string s;
    for(int i=0 ; i < ex.size() ; i++ ){
      if( i+1 < ex.size() && ex[i] == '-' && ex[i+1] == '>' ){
        s.push_back( '>' );
        i++;
      }else{
        s.push_back( ex[i] );
      }
    }
    
    // '=' の左側を ex1, 右側を ex2 とする
    string ex1, ex2;
    bool flag = false;
    for(int i=0 ; i < s.size() ; i++ ){
      if( s[i] == '=' ){
        flag = true;
      }else if( flag ){
        ex2.push_back( s[i] );
      }else{
        ex1.push_back( s[i] );
      }
    }
    
    // 登場する変数('a' - 'k')をチェック
    int f[256] = {0};
    for(int i= 0 ; i < s.size() ; i++ ){
      f[ s[i] ] = 1;
    }
    vector<char> vc;
    for(char c = 'a' ; c <= 'k' ; c++ ){
      if( f[c] ){
        vc.push_back( c );
      }
    }
    // N := 登場する変数の種類.
    int N = vc.size();
    
    // 変数の置き換えを 2^N 通り試し すべての式の評価で右辺と左辺が等しいか調べる.
    bool ans = true;
    for(int bits = 0 ; bits < (1<<N) ; bits++ ){
      string ex1_ = ex1;
      string ex2_ = ex2;
      // 変数を "T" or "F" に置き換えておく
      for(int i=0 ; i < N ; i++ ){
        // i 番目の文字を'T' か 'F'にしておく
        if( bits & (1<<i) ){
          change( ex1_ , vc[i] , 'T' );
          change( ex2_ , vc[i] , 'T' );
        }else{
          change( ex1_ , vc[i] , 'F' );
          change( ex2_ , vc[i] , 'F' );
        }
      }
      // "--" の除去
      minus_erase( ex1_ );
      minus_erase( ex2_ );
      
      // 式 ex1 が "T" か "F" になるまで文字列置換を繰り返す.
      bool minus_flag = true;
      while( ex1_.size() > 1 ){
        minus_calc( ex1_ );
        calc( ex1_ );
      }
      // 式 ex2 が "T" か "F" になるまで文字列置換を繰り返す.
      while( ex2_.size() > 1 ){
        minus_calc( ex2_ );
        calc( ex2_ );
      }
      // 式 ex1 と 式 ex2 が等しいかどうか
      if( ex1_ != ex2_ ){ ans = false; break;}
    }
    // 出力 
    if( ans ){
      cout << "YES" << endl;
    }else{
      cout << "NO" << endl;
    }
  }
}

Measured memory_bytes: 908