Advertisement
Guest User

url parser

a guest
Feb 14th, 2013
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. #include <map>
  5.  
  6. enum key_e{WORD, OPERATOR};
  7. struct Token{
  8.     key_e key;
  9.     std::string value;
  10.    
  11.     Token(key_e key):key(key){}
  12.     Token(key_e key, std::string value):key(key), value(value){}
  13. };
  14. std::vector<Token> lex(const std::string& str){
  15.     std::vector<Token> tokens;
  16.     std::string value;
  17.     enum{Begin, Word} state = Begin;
  18.    
  19.     for(char c : str){
  20.         if(std::isalpha(c) || std::isdigit(c)){
  21.             if(state == Begin)state = Word;
  22.             value += c;
  23.         }
  24.         else if(std::isspace(c))break;
  25.         else{
  26.             if(state == Word){
  27.                 tokens.push_back({WORD, value});
  28.                 value.clear();
  29.                 state = Begin;
  30.             }
  31.             tokens.push_back({OPERATOR, {c}}); 
  32.         }
  33.     }
  34.     if(state == Word)tokens.push_back({WORD, value});
  35.        
  36.     return std::move(tokens);
  37. }
  38. template <class Fnc>
  39. bool parse(std::vector<Token>& tokens, const std::vector<Token>& pattern, Fnc fnc){
  40.     if(tokens.size() < pattern.size())return false;
  41.    
  42.     if(std::equal(pattern.begin(), pattern.end(), tokens.begin(), [](const Token& p, const Token& t){
  43.         return (p.key == t.key) && p.value.empty()?true:(p.value==t.value);
  44.     })){
  45.         fnc();
  46.         tokens.erase(tokens.begin(), tokens.begin() + pattern.size());
  47.         return true;
  48.     }
  49.     return false;
  50. }
  51.  
  52. int main(){
  53.     auto tokens = lex("https://domena.sk:80/cesta/cesta/subor.hpp ");
  54.     std::map<std::string, std::string>   data{{"error", "false"}};
  55.     //HTTP:
  56.     parse(tokens, {WORD, {OPERATOR, ":"}, {OPERATOR, "/"}, {OPERATOR, "/"}}, [&](){
  57.         data["http"] = tokens[0].value;
  58.     });
  59.     //DOMENA:
  60.     while(parse(tokens, {WORD, {OPERATOR, "."}}, [&](){
  61.         data["domena"] += tokens[0].value;
  62.         data["domena"] += tokens[1].value; 
  63.     }));
  64.     if(parse(tokens, {WORD}, [&](){
  65.         if(data["domena"].empty()){
  66.             data["error"] = "true";
  67.             data["domena"] = "<error>";
  68.         }
  69.         data["domena"] += tokens[0].value;
  70.     }));
  71.     else{
  72.         data["error"] = "true";
  73.         data["domena"] += "<error>";
  74.     }
  75.     //PORT:
  76.     parse(tokens, {{OPERATOR, ":"}, WORD}, [&](){
  77.         data["port"] = tokens[1].value;
  78.     });
  79.     //CESTA & SUBOR:
  80.     while(parse(tokens, {{OPERATOR, "/"}, WORD}, [&](){
  81.         if(data["subor"].size())data["cesta"] += tokens[0].value;
  82.         data["cesta"] += data["subor"];
  83.         data["subor"] = tokens[1].value;
  84.     }));
  85.     //PRIPONA SUBORU:
  86.     if(parse(tokens, {{OPERATOR, "."}, WORD}, [&](){
  87.     data["subor"] += tokens[0].value;
  88.         data["subor"] += tokens[1].value;
  89.     }));
  90.    
  91.     if(tokens.size())data["error"] = "true";
  92.     for(auto&d : data)std::cout << d.first << ": " << d.second << std::endl;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement