Advertisement
Ardente

Parser Constructor Complete

Aug 20th, 2020
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.68 KB | None | 0 0
  1. #include "token.h"
  2.  
  3. using namespace TokenTools;
  4.  
  5. Token::Token(TokenGroup group, std::variant<char, std::string> contents, Token* previousToken) : mGroup(group), mContents(contents), mPrecedenceGroup(-1)
  6. {
  7.     isMultiCharToken = mContents.index();
  8.  
  9.     if (isMultiCharToken)
  10.     {
  11.         using MCO = MultiCharOperators;
  12.  
  13.         mOperatorType = multiCharOperatorMappings[std::get<std::string>(mContents)];
  14.  
  15.         switch (std::get<MultiCharOperators>(mOperatorType))
  16.         {
  17.         case MCO::SCOPE_RESOLUTION:
  18.             mPrecedenceGroup = 17;
  19.             break;
  20.  
  21.         case MCO::INCREMENT:
  22.             if (previousToken != nullptr)
  23.             {
  24.                 if (*previousToken == TokenGroup::NUMERIC_LITERAL || *previousToken == TokenGroup::IDENTIFIER)
  25.                 {
  26.                     mOperatorType = MultiCharOperators::POSTFIX_INCREMENT;
  27.                     mPrecedenceGroup = 16;
  28.                     break;
  29.                 }
  30.                 else
  31.                 {
  32.                     mOperatorType = MultiCharOperators::PREFIX_INCREMENT;
  33.                     mPrecedenceGroup = 15;
  34.                     break;
  35.                 }
  36.             }
  37.  
  38.             mOperatorType = MultiCharOperators::INCREMENT;
  39.             mPrecedenceGroup = -1;
  40.             break;
  41.  
  42.         case MCO::DECREMENT:
  43.             if (previousToken != nullptr)
  44.             {
  45.                 if (*previousToken == TokenGroup::NUMERIC_LITERAL || *previousToken == TokenGroup::IDENTIFIER)
  46.                 {
  47.                     mOperatorType = MultiCharOperators::POSTFIX_DECREMENT;
  48.                     mPrecedenceGroup = 16;
  49.                     break;
  50.                 }
  51.                 else
  52.                 {
  53.                     mOperatorType = MultiCharOperators::PREFIX_DECREMENT;
  54.                     mPrecedenceGroup = 15;
  55.                     break;
  56.                 }
  57.             }
  58.  
  59.             mOperatorType = MultiCharOperators::DECREMENT;
  60.             mPrecedenceGroup = -1;
  61.             break;
  62.  
  63.         case MCO::PARANTHESIS:
  64.             if (previousToken != nullptr)
  65.             {
  66.                 switch (previousToken->getGroup())
  67.                 {
  68.                 case TokenGroup::IDENTIFIER:
  69.                     mOperatorType = MultiCharOperators::FUNCTION_CALL;
  70.                     mPrecedenceGroup = 16;
  71.                     break;
  72.  
  73.                 case TokenGroup::KEYWORD:
  74.                     mOperatorType = MultiCharOperators::TYPE_CAST;
  75.                     mPrecedenceGroup = 15;
  76.                     break;
  77.  
  78.                 default:
  79.                     break;
  80.                 }
  81.  
  82.                 break;
  83.             }
  84.  
  85.             mOperatorType = MultiCharOperators::PARANTHESIS;
  86.             mPrecedenceGroup = -1;
  87.             break;
  88.  
  89.         case MCO::MEMBER_ACCESS_POINTER: case MCO::ARRAY_SUBSCRIPT: case MCO::TYPE_NAME: case MCO::CONST_TYPE_CONERSION:
  90.         case MCO::DYNAMIC_TYPE_CONVERSION: case MCO::REINTERPRETED_TYPE_CONVERSION: case MCO::STATIC_TYPE_CONVERSION:
  91.             mPrecedenceGroup = 16;
  92.             break;
  93.  
  94.         case MCO::SIZE_OF_OBJECT: case MCO::BINARY_NOT: case MCO::LOGICAL_NOT: case MCO::CREATE_HEAP_OBJECT:
  95.         case MCO::DESTROY_HEAP_OBJECT:
  96.             mPrecedenceGroup = 15;
  97.             break;
  98.  
  99.         case MCO::MEMBER_ACCESS_OBJECT_DEREFERENCE: case MCO::MEMBER_ACCESS_POINTER_DEREFERENCE:
  100.             mPrecedenceGroup = 14;
  101.             break;
  102.  
  103.         case MCO::BINARY_LEFT_SHIFT: case MCO::BINARY_RIGHT_SHIFT:
  104.             mPrecedenceGroup = 11;
  105.             break;
  106.  
  107.         case MCO::LESS_THAN_OR_EQUAL_TO: case MCO::GREATER_THAN_OR_EQUAL_TO:
  108.             mPrecedenceGroup = 10;
  109.             break;
  110.  
  111.         case MCO::EQUALITY: case MCO::INEQUALITY:
  112.             mPrecedenceGroup = 9;
  113.             break;
  114.  
  115.         case MCO::LOGICAL_AND:
  116.             mPrecedenceGroup = 5;
  117.             break;
  118.  
  119.         case MCO::LOGICAL_OR:
  120.             mPrecedenceGroup = 4;
  121.             break;
  122.  
  123.         case MCO::TERNARY_OPERATOR:
  124.             mPrecedenceGroup = 3;
  125.             break;
  126.  
  127.         case MCO::MULTIPLY_ASSIGNMENT: case MCO::DIVISION_ASSIGNMENT: case MCO::MODULUS_ASSIGNMENT:
  128.         case MCO::ADDITION_ASSIGNMENT: case MCO::SUBTRACTION_ASSIGNMENT: case MCO::LEFT_SHIFT_ASSIGNMENT:
  129.         case MCO::RIGHT_SHIFT_ASSIGNMENT: case MCO::BITWISE_AND_ASSIGNMENT: case MCO::BITWISE_INCLUSIVE_OR_ASSIGNMENT:
  130.         case MCO::BITWISE_EXCLUSIVE_OR_ASSIGNMENT:
  131.             mPrecedenceGroup = 2;
  132.             break;
  133.  
  134.         case MCO::THROW_EXCEPTION:
  135.             mPrecedenceGroup = 1;
  136.             break;
  137.  
  138.         default:
  139.             break;
  140.         }
  141.     }
  142.     else
  143.     {
  144.         using UCO = UniCharOperators;
  145.  
  146.         mOperatorType = UCO{ std::get<char>(mContents) };
  147.  
  148.         switch (std::get<UniCharOperators>(mOperatorType))
  149.         {
  150.         case UCO::STAR_SYMBOL:
  151.             if (previousToken != nullptr)
  152.             {
  153.                 if (*previousToken == TokenGroup::NUMERIC_LITERAL || *previousToken == TokenGroup::USER_LITERAL ||
  154.                     *previousToken == TokenGroup::IDENTIFIER)
  155.                 {
  156.                     mOperatorType = UCO::MULTIPLICATION;
  157.                     mPrecedenceGroup = 13;
  158.                 }
  159.                 else
  160.                 {
  161.                     mOperatorType = UCO::DEREFERENCE;
  162.                     mPrecedenceGroup = 15;
  163.                 }
  164.             }
  165.             else
  166.             {
  167.                 mOperatorType = UCO::DEREFERENCE;
  168.                 mPrecedenceGroup = 15;
  169.             }
  170.             break;
  171.  
  172.         case UCO::PLUS_SIGN:
  173.             if (previousToken != nullptr)
  174.             {
  175.                 if (*previousToken == TokenGroup::NUMERIC_LITERAL || *previousToken == TokenGroup::USER_LITERAL ||
  176.                     *previousToken == TokenGroup::IDENTIFIER)
  177.                 {
  178.                     mOperatorType = UCO::ADDITION;
  179.                     mPrecedenceGroup = 12;
  180.                 }
  181.                 else
  182.                 {
  183.                     mOperatorType = UCO::UNARY_PLUS;
  184.                     mPrecedenceGroup = 15;
  185.                 }
  186.             }
  187.             else
  188.             {
  189.                 mOperatorType = UCO::UNARY_PLUS;
  190.                 mPrecedenceGroup = 15;
  191.             }
  192.             break;
  193.  
  194.         case UCO::MINUS_SIGN:
  195.             if (previousToken != nullptr)
  196.             {
  197.                 if (*previousToken == TokenGroup::NUMERIC_LITERAL || *previousToken == TokenGroup::USER_LITERAL ||
  198.                     *previousToken == TokenGroup::IDENTIFIER)
  199.                 {
  200.                     mOperatorType = UCO::SUBTRACTION;
  201.                     mPrecedenceGroup = 12;
  202.                 }
  203.                 else
  204.                 {
  205.                     mOperatorType = UCO::UNARY_NEGATION;
  206.                     mPrecedenceGroup = 15;
  207.                 }
  208.             }
  209.             else
  210.             {
  211.                 mOperatorType = UCO::UNARY_NEGATION;
  212.                 mPrecedenceGroup = 15;
  213.             }
  214.             break;
  215.  
  216.         case UCO::AND_SIGN:
  217.             if (previousToken != nullptr)
  218.             {
  219.                 if (*previousToken == TokenGroup::NUMERIC_LITERAL || *previousToken == TokenGroup::USER_LITERAL ||
  220.                     *previousToken == TokenGroup::IDENTIFIER)
  221.                 {
  222.                     mOperatorType = UCO::BITWISE_AND;
  223.                     mPrecedenceGroup = 8;
  224.                 }
  225.                 else
  226.                 {
  227.                     mOperatorType = UCO::ADDRESS_ACCESS;
  228.                     mPrecedenceGroup = 15;
  229.                 }
  230.             }
  231.             else
  232.             {
  233.                 mOperatorType = UCO::ADDRESS_ACCESS;
  234.                 mPrecedenceGroup = 15;
  235.             }
  236.             break;
  237.  
  238.         case UCO::LEFT_PARANTHESIS: case UCO::RIGHT_PARANTHESIS: case UCO::ARRAY_SUBSCRIPT_LEFT:
  239.         case UCO::ARRAY_SUBSCRIPT_RIGHT:
  240.             mPrecedenceGroup = -1;
  241.             break;
  242.  
  243.         case UCO::MEMBER_OBJECT_ACCESS:
  244.             mPrecedenceGroup = 16;
  245.             break;
  246.  
  247.         case UCO::BINARY_NOT: case UCO::LOGICAL_NOT:
  248.             mPrecedenceGroup = 15;
  249.             break;
  250.  
  251.         case UCO::DIVISION: case UCO::MODULUS:
  252.             mPrecedenceGroup = 13;
  253.             break;
  254.  
  255.         case UCO::LESS_THAN: case UCO::GREATER_THAN:
  256.             mPrecedenceGroup = 10;
  257.             break;
  258.  
  259.         case UCO::BITWISE_EXCLUSIVE_OR:
  260.             mPrecedenceGroup = 7;
  261.             break;
  262.  
  263.         case UCO::BITWISE_INCLUSIVE_OR:
  264.             mPrecedenceGroup = 6;
  265.             break;
  266.  
  267.         case UCO::ASSIGNMENT:
  268.             mPrecedenceGroup = 2;
  269.             break;
  270.  
  271.         case UCO::COMMA:
  272.             mPrecedenceGroup = 0;
  273.             break;
  274.  
  275.         default:
  276.             break;
  277.         }
  278.     }
  279. }
  280.  
  281. std::string Token::getContents()
  282. {
  283.     if (!mContents.index())
  284.         return std::string{ std::get<char>(mContents) };
  285.     else
  286.         return std::get<std::string>(mContents);
  287. }
  288.  
  289. TokenGroup& Token::getGroup()
  290. {
  291.     return mGroup;
  292. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement