poj 2314 POJ language

poj 2314 POJ language,第1张

poj 2314 POJ language
#include <cstdio>  #include <cctype>  #include <string>  #include <map>  #include <vector>  #include <functional>  #include <algorithm>  using namespace std;  bool isNumber(const string& s){    if(s.empty()) return false;      for(int i = 0; i < s.size(); ++i){          if(!isdigit(s[i])) return false;      }      return true;  }  int tonumber(const string& s){    int n;      sscanf(s.c_str(), "%d", &n);      return n;  }  struct expression{      virtual ~expression(){}      virtual void execute(){};  };  class Scope{  private:      map<string,int> namevalueMap;      map<string,int>::const_iterator iter;      void intercept(const string& name){          printf("before access "%s"n", name.c_str());          for(iter = namevalueMap.begin(); iter != namevalueMap.end(); ++iter){   printf("%s = %dn", iter->first.c_str(), iter->second);          }      }  public:      int& operator [] (const string& name){return namevalueMap[name];      }  } global;  bool Terminate = false;  struct Special : public expression{      string variable;      Special(const string& s) : variable(s){}      virtual void execute(){          ::Terminate = true;          printf("%dn", global[variable]);      }  };  struct Assignment : public expression{      string A, B, OP, C;      Assignment(const string& s){string::size_type equalSign = s.find('=');          A = s.substr(0, equalSign);          string::size_type op = s.find_first_of("+-*", equalSign+1);          if(op == string::npos) B = s.substr(equalSign+1);          else{   B = s.substr(equalSign+1, op-equalSign-1);   OP.push_back(s[op]);   C = s.substr(op+1);          }          if(isNumber(B)) global[B] = tonumber(B);          if(isNumber(C)) global[C] = tonumber(C);      }      virtual void execute(){          if(OP.empty()) global[A] = global[B];          else if(OP == "+") global[A] = global[B] + global[C];          else if(OP == "-") global[A] = global[B] - global[C];          else global[A] = global[B] * global[C];      }  };  struct Judgement : public expression{      string A, OP, B;      bool result;      Judgement(const string& s){          string::size_type pos = s.find_first_of("<=");          if(s[pos+1] == '='){  A = s.substr(0, pos);   OP = s.substr(pos, 2);   B = s.substr(pos+2);          }          else{ A = s.substr(0, pos);   OP.push_back(s[pos]);   B = s.substr(pos+1);          }          if(isNumber(A)) global[A] = tonumber(A);          if(isNumber(B)) global[B] = tonumber(B);      }      virtual void execute(){          if(OP == "<") result = global[A] < global[B];          else if(OP == "==") result = global[A] == global[B];          else result = global[A] <= global[B];      }      bool judge(){          execute();          return result;      }  };  struct IfSuite : public expression{      Judgement condition;      vector<expression*> clause;      IfSuite(const string& s) : condition(s){}      ~IfSuite(){          for(int i = 0; i < clause.size(); ++i) delete clause[i];      }      void addClause(expression* exp){          clause.push_back(exp);      }      virtual void execute(){          if(!::Terminate && condition.judge()){   for_each(clause.begin(), clause.end(), mem_fun(&expression::execute));          }      }  };  struct WhileSuite : public expression{      Judgement condition;      vector<expression*> clause;      WhileSuite(const string& s) : condition(s){}      ~WhileSuite(){          for(int i = 0; i < clause.size(); ++i) delete clause[i];      }      void addClause(expression* exp){          clause.push_back(exp);      }      virtual void execute(){          while(!::Terminate && condition.judge()){   for_each(clause.begin(), clause.end(), mem_fun(&expression::execute));          }      }  };  class Program{  private:      vector<expression*> clause;  private:      expression* loadSpecial(){          char c;          string name;          while((c = getchar()) != ';'){   if(!isspace(c)) name.push_back(c);          }          return new Special(name);      }      expression* loadIf(){          char c;          string condition;          while((c = getchar()) != ')'){   if(!isspace(c)) condition.push_back(c);          }          IfSuite* suite = new IfSuite(condition);          while(getchar() != '{') ;          load(suite->clause, '}');          return suite;      }      expression* loadWhile(){          char c;          string condition;          while((c = getchar()) != ')'){   if(!isspace(c)) condition.push_back(c);          }          WhileSuite* suite = new WhileSuite(condition);          while(getchar() != '{') ;          load(suite->clause, '}');          return suite;      }      void load(vector<expression*>& v, int endTag = -1){          int c;          string s;          while((c = getchar()) != endTag){ if(isspace(c)) continue;   if(c == '('){     if(s == "if") v.push_back(loadIf());       else v.push_back(loadWhile());       s.clear();   }   else if(c == '#'){     v.push_back(loadSpecial());       s.clear();   }   else if(c == ';'){     if(!s.empty()){v.push_back(new Assignment(s));s.clear();       }   }   else s.push_back(c);        }      }  public:      ~Program(){          for(int i = 0; i < clause.size(); ++i) delete clause[i];      }      void load(){          load(clause);      }      void run(){          for_each(clause.begin(), clause.end(), mem_fun(&expression::execute));      }  };  int main()  {      Program tiny;      tiny.load();      tiny.run();      return 0;  }

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/4913515.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存