Token.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "Token.hpp"
  2. string token_name(TokenType t) {
  3. switch (t) {
  4. case END_OF_FILE: return "END_OF_FILE";
  5. case NEWLINE: return "NEWLINE";
  6. case NUMBER: return "NUMBER";
  7. case IDENT: return "IDENT";
  8. case STRING: return "STRING";
  9. // Keywords
  10. case LABEL: return "LABEL";
  11. case GOTO: return "GOTO";
  12. case PRINT: return "PRINT";
  13. case INPUT: return "INPUT";
  14. case LET: return "LET";
  15. case IF: return "IF";
  16. case THEN: return "THEN";
  17. case ENDIF: return "ENDIF";
  18. case WHILE: return "WHILE";
  19. case REPEAT: return "REPEAT";
  20. case ENDWHILE: return "ENDWHILE";
  21. // Operators
  22. case EQ: return "EQ";
  23. case PLUS: return "PLUS";
  24. case MINUS: return "MINUS";
  25. case ASTERISK: return "ASTERISK";
  26. case SLASH: return "SLASH";
  27. case EQEQ: return "EQEQ";
  28. case NOTEQ: return "NOTEQ";
  29. case LT: return "LT";
  30. case LTEQ: return "LTEQ";
  31. case GT: return "GT";
  32. case GTEQ: return "GTEQ";
  33. default: return "UNKNOWN";
  34. }
  35. }
  36. TokenType token_type_from_name(const string &name) {
  37. if (name == "END_OF_FILE") return END_OF_FILE;
  38. if (name == "NEWLINE") return NEWLINE;
  39. if (name == "NUMBER") return NUMBER;
  40. if (name == "IDENT") return IDENT;
  41. if (name == "STRING") return STRING;
  42. // Keywords
  43. if (name == "LABEL") return LABEL;
  44. if (name == "GOTO") return GOTO;
  45. if (name == "PRINT") return PRINT;
  46. if (name == "INPUT") return INPUT;
  47. if (name == "LET") return LET;
  48. if (name == "IF") return IF;
  49. if (name == "THEN") return THEN;
  50. if (name == "ENDIF") return ENDIF;
  51. if (name == "WHILE") return WHILE;
  52. if (name == "REPEAT") return REPEAT;
  53. if (name == "ENDWHILE") return ENDWHILE;
  54. // Operators
  55. if (name == "EQ") return EQ;
  56. if (name == "PLUS") return PLUS;
  57. if (name == "MINUS") return MINUS;
  58. if (name == "ASTERISK") return ASTERISK;
  59. if (name == "SLASH") return SLASH;
  60. if (name == "EQEQ") return EQEQ;
  61. if (name == "NOTEQ") return NOTEQ;
  62. if (name == "LT") return LT;
  63. if (name == "LTEQ") return LTEQ;
  64. if (name == "GT") return GT;
  65. if (name == "GTEQ") return GTEQ;
  66. return UNKNOWN; // Default case for unknown names
  67. }
  68. Token::Token():text("UNKNOWN"), kind(UNKNOWN){}
  69. Token::Token(string tokenText, TokenType tokenKind):text(tokenText), kind(tokenKind) { }
  70. /* Checks if a string is a keyword,
  71. if it's the case returns the token associated
  72. if not returns an identifier token
  73. */
  74. TokenType checkIfKeyword(string &tokenText){
  75. TokenType token_type = token_type_from_name(tokenText);
  76. int token_value = static_cast<int>(token_type);
  77. if (100 < token_value && token_value < 200)
  78. return token_type;
  79. return TokenType::IDENT;
  80. }
  81. TokenType Token::get_kind() {
  82. return this->kind;
  83. }
  84. string Token::get_text() {
  85. return this->text;
  86. }