Token.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "Token.h"
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <boost/lexical_cast.hpp>
  6. namespace Scanner {
  7. //==============================================================================
  8. // Copy constructor =
  9. //==============================================================================
  10. Token::Token(const Token& b)
  11. : code(b.code),
  12. dataType(b.dataType)
  13. {
  14. switch(b.dataType)
  15. {
  16. case DT_FLOAT:
  17. value.float_ = b.value.float_;
  18. break;
  19. case DT_INT:
  20. value.int_ = b.value.int_;
  21. break;
  22. case DT_CHAR:
  23. value.char_ = b.value.char_;
  24. break;
  25. case DT_STR:
  26. value.string = b.value.string;
  27. break;
  28. }
  29. memcpy(&asString[0], &b.asString[0], sizeof(asString));
  30. }
  31. //==============================================================================
  32. // getInfoStr =
  33. //==============================================================================
  34. std::string Token::getInfoStr() const
  35. {
  36. char tokenInfoStr[512];
  37. switch(code)
  38. {
  39. case TC_COMMENT:
  40. return "comment";
  41. case TC_NEWLINE:
  42. return "newline";
  43. case TC_EOF:
  44. return "end of file";
  45. case TC_STRING:
  46. sprintf(tokenInfoStr, "string \"%s\"", value.string);
  47. break;
  48. case TC_CHAR:
  49. sprintf(tokenInfoStr, "char '%c' (\"%s\")", value.char_,
  50. &asString[0]);
  51. break;
  52. case TC_NUMBER:
  53. if(dataType == DT_FLOAT)
  54. {
  55. sprintf(tokenInfoStr, "float %f or %e (\"%s\")", value.float_,
  56. value.float_, &asString[0]);
  57. }
  58. else
  59. sprintf(tokenInfoStr, "int %lu (\"%s\")", value.int_,
  60. &asString[0]);
  61. break;
  62. case TC_IDENTIFIER:
  63. sprintf(tokenInfoStr, "identifier \"%s\"", value.string);
  64. break;
  65. case TC_ERROR:
  66. return "scanner error";
  67. break;
  68. default:
  69. if(code >= TC_KE && code <= TC_KEYWORD)
  70. {
  71. sprintf(tokenInfoStr, "reserved word \"%s\"", value.string);
  72. }
  73. else if(code>=TC_SCOPERESOLUTION && code<=TC_ASSIGNOR)
  74. {
  75. sprintf(tokenInfoStr, "operator no %d",
  76. code - TC_SCOPERESOLUTION);
  77. }
  78. }
  79. return tokenInfoStr;
  80. }
  81. //==============================================================================
  82. // print =
  83. //==============================================================================
  84. void Token::print() const
  85. {
  86. std::cout << "Token: " << getInfoStr() << std::endl;
  87. }
  88. } // end namespace