Advertisement
MyPix

C++ Lexer (working!) Par pierre vh

Oct 16th, 2014
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.46 KB | None | 0 0
  1. #include "Lexer.h"
  2. int tour;
  3. bool Lexer::isAlphanum(char const& c)
  4. {
  5.     if (isalpha(c) || isdigit(c))
  6.         return 0;
  7.     return 1;
  8. }
  9.  
  10.  
  11. Lexer::Lexer()
  12. {
  13. }
  14. Lexer::~Lexer()
  15. {
  16. }
  17. deque<Token>* Lexer::Tokenize(string const& str)
  18. {
  19.     eatChar(str, 0);
  20.     return toks;
  21. }
  22. deque<Token>* Lexer::returnTkDqPtr()
  23. {
  24.     return toks;
  25. }
  26. Token Lexer::makeToken(string const& fragment, nToken::tTypes const& category)
  27. {
  28.     Token rtr(fragment, category);
  29.     return rtr;
  30. }
  31. void Lexer::flushToken()
  32. {
  33.     Token push(curtok, nToken::tTypes::undefined);
  34.     if (NAML_DEBUG_MSG)
  35.         cout << "pushed " << push.getContent() << endl;
  36.     toks->push_back(push);
  37.     curtok = "";
  38. }
  39. void Lexer::flushToken(nToken::tTypes const& type)
  40. {
  41.     Token push(curtok,type);
  42.     if (NAML_DEBUG_MSG)
  43.         cout << "pushed " << push.getContent() << endl;
  44.     toks->push_back(push);
  45.     curtok = "";
  46. }
  47. bool Lexer:: eatChar(string const& str, int const& pos)
  48. {
  49.     if (NAML_DEBUG_MSG)
  50.     {
  51.         tour++;
  52.         cout << "@" << tour << endl;
  53.     }
  54.     int npos = (pos + 1);
  55.     char _now = str[pos];
  56.     if (pos == str.length())
  57.     {
  58.         if (curtok != "")
  59.             flushToken();
  60.         return 1;
  61.     }
  62.     switch (nGettype(_now))
  63.     {
  64.             //
  65.             case cTypes::quote:
  66.             case cTypes::apos:
  67.                 if (isInStr)
  68.                     {
  69.                         isInStr = false;
  70.                         flushToken(nToken::tTypes::nstring);
  71.                     }
  72.                 else
  73.                     {
  74.                         isInStr = true;
  75.                         return eatChar(str, npos);
  76.                     }
  77.                 break;
  78.             //
  79.             case cTypes::alpha:
  80.                 if (curtok == "")
  81.                 {
  82.                     curtok += _now;
  83.                     return eatChar(str, npos);
  84.                 }
  85.                 else
  86.                 {
  87.                     if (isWord(curtok))
  88.                     {
  89.                         curtok += _now;
  90.                         return eatChar(str, npos);
  91.                     }
  92.                     else
  93.                     {
  94.                         flushToken();
  95.                         return eatChar(str, pos);
  96.                     }
  97.                 }
  98.                 break;
  99.             case cTypes::num:
  100.                 curtok += _now;
  101.                 return eatChar(str, npos);
  102.                 break;
  103.             case cTypes::op_bracket:
  104.             case cTypes::cls_bracket:
  105.             case cTypes::op_par:
  106.             case cTypes::cls_par:
  107.             case cTypes::op_cbrack:
  108.             case cTypes::cls_cbrack:
  109.             case cTypes::semicolon:
  110.             case cTypes::underscore:
  111.             case cTypes::dollarsign:
  112.             case cTypes::andsign:
  113.             case cTypes::asterisk:
  114.             case cTypes::div:
  115.             case cTypes::idiv:
  116.             case cTypes::tiret:
  117.             case cTypes::plus:
  118.             case cTypes::equal:
  119.             case cTypes::exp:
  120.             case cTypes::dash:
  121.             case cTypes::tilde:
  122.             case cTypes::imp:
  123.             case cTypes::interr:
  124.             case cTypes::virg:
  125.             case cTypes::dpoint:
  126.             case cTypes::point:
  127.             case cTypes::modulo:
  128.             case cTypes::lowthan:
  129.             case cTypes::grethan:
  130.                 if (curtok != "")
  131.                 {
  132.                     flushToken();
  133.                     return eatChar(str, pos);
  134.                 }
  135.                 else
  136.                 {
  137.                     curtok += _now;
  138.                     flushToken();
  139.                     return eatChar(str,npos);
  140.                 }
  141.                 break;
  142.             case cTypes::space:
  143.                 if (curtok != "")
  144.                 {
  145.                     flushToken();
  146.                     return eatChar(str,npos);
  147.                 }
  148.                 else
  149.                 {
  150.                     try{
  151.                         if (isspace(str[npos]))
  152.                             return eatChar(str, npos + 1);
  153.                         else
  154.                             return eatChar(str, npos);
  155.                     }
  156.                     catch (const std::out_of_range& oor)
  157.                     {
  158.                         return 1;
  159.                     }
  160.                 }
  161.             case cTypes::unknown:
  162.                  return eatChar(str,npos);
  163.                 break;
  164.             default:
  165.                 return eatChar(str,npos);
  166.                 break;
  167.     }
  168.     return 1;
  169. }
  170. bool Lexer::isWord(string const& str)
  171. {
  172.     for (int j(0); j < str.length(); j++)
  173.     {
  174.         if (isalpha(str[j]))
  175.             continue;
  176.         else
  177.             return 0;
  178.     }
  179.     return 1;
  180. }
  181. cTypes Lexer::nGettype(char const& c)
  182. {
  183.  
  184.         if (isalpha(c))
  185.             return cTypes::alpha;
  186.         else if (isdigit(c))
  187.             return cTypes::num;
  188.         else if (isspace(c))
  189.             return cTypes::space;
  190.     switch (c)
  191.     {
  192.             case '[':
  193.                 return cTypes::op_bracket;
  194.                 break;
  195.             case ']':
  196.                 return cTypes::cls_bracket;
  197.                 break;
  198.                 ///////////////////////
  199.             case '(':
  200.                 return cTypes::op_par;
  201.                 break;
  202.             case ')':
  203.                 return cTypes::cls_par;
  204.                 break;
  205.                 ///////////////////////
  206.             case '{':
  207.                 return cTypes::op_cbrack;
  208.                 break;
  209.             case '}':
  210.                 return cTypes::cls_cbrack;
  211.                 break;
  212.                 ///////////////////////
  213.             case '>':
  214.                 return cTypes::grethan;
  215.                 break;
  216.             case '<':
  217.                 return cTypes::lowthan;
  218.                 break;
  219.                 ///////////////////////
  220.             case '-':
  221.                 return cTypes::tiret; // Also considered as minus
  222.                 break;
  223.             case '_':
  224.                 return cTypes::underscore;
  225.                 break;
  226.             case '~':
  227.                 return cTypes::tilde;
  228.                 break;
  229.                 ///////////////////////
  230.             case '.':
  231.                 return cTypes::point;
  232.                 break;
  233.             case ':':
  234.                 return cTypes::dpoint;
  235.                 break;
  236.             case ',':
  237.                 return cTypes::virg;
  238.                 break;
  239.             case ';':
  240.                 return cTypes::semicolon;
  241.                 break;
  242.             case '!':
  243.                 return cTypes::imp;
  244.                 break;
  245.             case '?':
  246.                 return cTypes::interr;
  247.                 break;
  248.             case '#':
  249.                 return cTypes::dash;
  250.                 break;
  251.             case '$':
  252.                 return cTypes::dollarsign;
  253.                 break;
  254.             case '&':
  255.                 return cTypes::andsign;
  256.                 break;
  257.                 ///////////////////////
  258.             case '/':
  259.                 return cTypes::div;
  260.                 break;
  261.             case '+':
  262.                 return cTypes::plus;
  263.                 break;
  264.             case '^':
  265.                 return cTypes::exp;
  266.                 break;
  267.             case '=':
  268.                 return cTypes::equal;
  269.                 break;
  270.             case '*':
  271.                 return cTypes::asterisk;
  272.                 break;
  273.             case '%':
  274.                 return cTypes::modulo;
  275.                 break;
  276.             case '\\':
  277.                 return cTypes::idiv;
  278.                 break;
  279.             case '"':
  280.                 return cTypes::quote;
  281.                 break;
  282.             case ' ':
  283.                 return cTypes::space;
  284.                 break;
  285.             case '\'':
  286.                 return cTypes::apos;
  287.                 break;
  288.                 ///////////////////////idk
  289.             default:
  290.                 return cTypes::unknown;
  291.                 break;
  292.     }
  293. }
  294.  
  295. nToken::tTypes Lexer::idTok(string tok)
  296. {
  297.     return nToken::tTypes::undefined;
  298. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement