//Code by Patcas Csaba #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define LL long long #define PII pair #define VB vector #define VI vector #define VD vector #define VS vector #define VPII vector > #define VVI vector < VI > #define VVB vector < VB > #define FORN(i, n) for(int i = 0; i < (n); ++i) #define FOR(i, a, b) for(int i = (a); i <= (b); ++i) #define FORD(i, a, b) for(int i = (a); i >= (b); --i) #define REPEAT do{ #define UNTIL(x) }while(!(x)); #define SZ size() #define BG begin() #define EN end() #define CL clear() #define X first #define Y second #define RS resize #define PB push_back #define MP make_pair #define ALL(x) x.begin(), x.end() #define in_file "a.in" #define out_file "a.out" #define WRITE_ERROR cout << "ERROR" << endl; #define WRITE_OK cout << "OK" << endl; string s; set valid; void init() { valid.insert('+'); valid.insert('-'); valid.insert('['); valid.insert(']'); valid.insert('B'); valid.insert('P'); valid.insert('D'); valid.insert('I'); valid.insert('S'); valid.insert('X'); FOR(ch, 'a', 'z') valid.insert(ch); FOR(ch, '0', '9') valid.insert(ch); } bool allValid() { FORN(i, s.SZ) if (!valid.count(s[i])) return false; return true; } int countBaseRegisters() { int ans = 0; FORN(i, s.SZ - 1) if (toupper(s[i]) == 'B' && toupper(s[i + 1]) == 'P' || toupper(s[i]) == 'B' && toupper(s[i + 1]) == 'X') { s[i] = toupper(s[i]); s[i + 1] = toupper(s[i + 1]); ++ans; } return ans; } int countIndexRegisters() { int ans = 0; FORN(i, s.SZ - 1) if (toupper(s[i]) == 'S' && toupper(s[i + 1]) == 'I' || toupper(s[i]) == 'D' && toupper(s[i + 1]) == 'I') { s[i] = toupper(s[i]); s[i + 1] = toupper(s[i + 1]); ++ans; } return ans; } int countLowerCase() { int ans = 0; FORN(i, s.SZ) if (islower(s[i])) ++ans; return ans; } bool startsEndsPlusMinus(string s) { return (s[0] == '+' || s[0] == '-' || s[s.SZ - 1] == '+' || s[s.SZ - 1] == '-'); } bool checkAllExpressions(string s) { if (startsEndsPlusMinus(s)) return false; bool ans = true; FORN(i, s.SZ - 1) if (s[i] == '[') { int lev = 1; FOR(j, i + 1, s.SZ - 1) { if (s[j] == '[') ++lev; if (s[j] == ']') --lev; if (lev == 0) { ans &= checkAllExpressions(s.substr(i + 1, j - i - 1)); i = j; break; } } } return ans; } int main() { //Read data //freopen(in_file, "r", stdin); //freopen(out_file, "w", stdout); init(); while (getline(cin, s)) { if (s == "") break; if (!allValid() || countBaseRegisters() > 1 || countIndexRegisters() > 1) { WRITE_ERROR continue; } if (countLowerCase() > 1 || startsEndsPlusMinus(s)) { WRITE_ERROR continue; } if (!checkAllExpressions(s)) { WRITE_ERROR continue; } WRITE_OK } //Solve //Write data return 0; }