PKU 2314 POJ language

http://poj.org/problem?id=2314
Cっぽい言語の簡易版インタプリタをかけというような問題。

A=B+Cとかの式のB,Cに負の数が来ないという条件を、比較の式でもあてはまると勘違いして、猛烈にはまっていました。
サブミットデバッグしまくったせいで提出数がものすごいことになりました。

map<string,ll> env;
vector<string> token;
int pos;
ll getval(string key){
  if(isalpha(key[0]))
    return env[key];
  ll ret=0;
  FOR(it,key)
    if(isdigit(*it))
      ret=ret*10+*it-'0';
  if(key[0]=='-') return -ret;
  return ret;
}

bool booleval(int p){
  ll a=getval(token[p]);
  ll b=getval(token[p+2]);
  if(token[p+1]=="<")
    return a<b;
  if(token[p+1]=="==")
    return a==b;
  return a<=b;
}

int match[10000];

void eval(){
  while(token[pos]!="}"){
    
    if(token[pos]=="if" && token[pos+1]!="="){
      int bpos = pos;
      if(booleval(pos+2)){
        pos += 7;
        eval();
      }
      pos = match[bpos+6]+1;
    }else if(token[pos]=="while" && token[pos+1]!="="){
      int bpos=pos;
      while(true){
        if(booleval(bpos+2)){
          pos=bpos+7;
          eval();
        }else break;
      }
      pos = match[bpos+6] + 1;
    }else if(token[pos][0]=='#'){
      cout << env[token[pos+1]] << endl;
      exit(0);
    }else{
      string a=token[pos];
      ll b=getval(token[pos+2]);

      if(token[pos+3]=="+"){
        ll c=getval(token[pos+4]);
        env[a]=b + c;
        pos += 5;
      }else if(token[pos+3]=="-"){
        ll c=getval(token[pos+4]);        
        env[a]=b - c;
        pos += 5;
      }else if(token[pos+3]=="*"){
        ll c=getval(token[pos+4]);        
        env[a]=b * c;
        pos += 5;
      }else{
        env[a]=b;
        pos += 3;
      }

      ++pos;
    }
  }
  ++pos;
}

main(){
  string in;
  while(true){
    string tmp;
    if(getline(cin,tmp))
      in += tmp;
    else break;
  }

  string split;
  char bef=' ';
  rep(i,SZ(in)){
    if(isspace(in[i])){
      split += in[i];
      continue;
    }
    char ch=in[i];
    if(in[i]=='-' && !isdigit(bef) && !isalpha(bef)){
      split += ' ';
      split += in[i];
    }else if(in[i]=='<' || in[i]=='='){
      split += ' ';
      split += in[i];
      if(in[i+1]=='='){
        split += '=';
        ++i;
      }
      split += ' ';      
    }else if(string("#(){}+-*;").find(in[i]) != string::npos){
      split += ' ';
      split += in[i];
      split += ' ';
    }else split += in[i];
    bef = ch;
  }

  stringstream ss(split);
  while(ss >> in)
    token.pb(in);

  stack<int> par;
  rep(i,SZ(token)){
    if(token[i]=="}"){
      int t=par.top();par.pop();
      match[i]=t;
      match[t]=i;
    }else if(token[i]=="{") par.push(i);
  }
  eval();
}