Advertisement
Ardente

Parser In Progress

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