Token.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /*
  2. * Copyright (c) 2020, Stephan Unverwerth <s.unverwerth@gmx.de>
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright notice, this
  9. * list of conditions and the following disclaimer.
  10. *
  11. * 2. Redistributions in binary form must reproduce the above copyright notice,
  12. * this list of conditions and the following disclaimer in the documentation
  13. * and/or other materials provided with the distribution.
  14. *
  15. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  16. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  18. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  19. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  21. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  22. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  23. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  24. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. */
  26. #include "Token.h"
  27. #include <AK/Assertions.h>
  28. namespace JS {
  29. const char* Token::name(TokenType type)
  30. {
  31. switch (type) {
  32. case TokenType::Ampersand:
  33. return "Ampersand";
  34. case TokenType::AmpersandEquals:
  35. return "AmpersandEquals";
  36. case TokenType::Asterisk:
  37. return "Asterisk";
  38. case TokenType::AsteriskAsteriskEquals:
  39. return "AsteriskAsteriskEquals";
  40. case TokenType::AsteriskEquals:
  41. return "AsteriskEquals";
  42. case TokenType::Await:
  43. return "Await";
  44. case TokenType::BoolLiteral:
  45. return "BoolLiteral";
  46. case TokenType::BracketOpen:
  47. return "BracketOpen";
  48. case TokenType::BracketClose:
  49. return "BracketClose";
  50. case TokenType::Caret:
  51. return "Caret";
  52. case TokenType::Catch:
  53. return "Catch";
  54. case TokenType::Class:
  55. return "Class";
  56. case TokenType::Comma:
  57. return "Comma";
  58. case TokenType::Const:
  59. return "Const";
  60. case TokenType::CurlyClose:
  61. return "CurlyClose";
  62. case TokenType::CurlyOpen:
  63. return "CurlyOpen";
  64. case TokenType::Delete:
  65. return "Delete";
  66. case TokenType::Do:
  67. return "Do";
  68. case TokenType::DoubleAmpersand:
  69. return "DoubleAmpersand";
  70. case TokenType::DoubleAsterisk:
  71. return "DoubleAsterisk";
  72. case TokenType::DoublePipe:
  73. return "DoublePipe";
  74. case TokenType::DoubleQuestionMark:
  75. return "DoubleQuestionMark";
  76. case TokenType::Else:
  77. return "Else";
  78. case TokenType::Eof:
  79. return "Eof";
  80. case TokenType::Equals:
  81. return "Equals";
  82. case TokenType::EqualsEquals:
  83. return "EqualsEquals";
  84. case TokenType::EqualsEqualsEquals:
  85. return "EqualsEqualsEquals";
  86. case TokenType::ExclamationMark:
  87. return "ExclamationMark";
  88. case TokenType::ExclamationMarkEquals:
  89. return "ExclamationMarkEquals";
  90. case TokenType::ExclamationMarkEqualsEquals:
  91. return "ExclamationMarkEqualsEquals";
  92. case TokenType::Finally:
  93. return "Finally";
  94. case TokenType::For:
  95. return "For";
  96. case TokenType::Function:
  97. return "Function";
  98. case TokenType::GreaterThan:
  99. return "GreaterThan";
  100. case TokenType::GreaterThanEquals:
  101. return "GreaterThanEquals";
  102. case TokenType::Identifier:
  103. return "Identifier";
  104. case TokenType::If:
  105. return "If";
  106. case TokenType::In:
  107. return "In";
  108. case TokenType::Instanceof:
  109. return "Instanceof";
  110. case TokenType::Interface:
  111. return "Interface";
  112. case TokenType::Invalid:
  113. return "Invalid";
  114. case TokenType::LessThan:
  115. return "LessThan";
  116. case TokenType::LessThanEquals:
  117. return "LessThanEquals";
  118. case TokenType::Let:
  119. return "Let";
  120. case TokenType::Minus:
  121. return "Minus";
  122. case TokenType::MinusEquals:
  123. return "MinusEquals";
  124. case TokenType::MinusMinus:
  125. return "MinusMinus";
  126. case TokenType::New:
  127. return "New";
  128. case TokenType::NullLiteral:
  129. return "NullLiteral";
  130. case TokenType::NumericLiteral:
  131. return "NumericLiteral";
  132. case TokenType::ParenClose:
  133. return "ParenClose";
  134. case TokenType::ParenOpen:
  135. return "ParenOpen";
  136. case TokenType::Percent:
  137. return "Percent";
  138. case TokenType::PercentEquals:
  139. return "PercentEquals";
  140. case TokenType::Period:
  141. return "Period";
  142. case TokenType::Pipe:
  143. return "Pipe";
  144. case TokenType::PipeEquals:
  145. return "PipeEquals";
  146. case TokenType::Plus:
  147. return "Plus";
  148. case TokenType::PlusEquals:
  149. return "PlusEquals";
  150. case TokenType::PlusPlus:
  151. return "PlusPlus";
  152. case TokenType::QuestionMark:
  153. return "QuestionMark";
  154. case TokenType::QuestionMarkPeriod:
  155. return "QuestionMarkPeriod";
  156. case TokenType::RegexLiteral:
  157. return "RegexLiteral";
  158. case TokenType::Return:
  159. return "Return";
  160. case TokenType::Semicolon:
  161. return "Semicolon";
  162. case TokenType::ShiftLeft:
  163. return "ShiftLeft";
  164. case TokenType::ShiftLeftEquals:
  165. return "ShiftLeftEquals";
  166. case TokenType::ShiftRight:
  167. return "ShiftRight";
  168. case TokenType::ShiftRightEquals:
  169. return "ShiftRightEquals";
  170. case TokenType::Slash:
  171. return "Slash";
  172. case TokenType::SlashEquals:
  173. return "SlashEquals";
  174. case TokenType::StringLiteral:
  175. return "StringLiteral";
  176. case TokenType::Tilde:
  177. return "Tilde";
  178. case TokenType::Try:
  179. return "Try";
  180. case TokenType::Typeof:
  181. return "Typeof";
  182. case TokenType::UnsignedShiftRight:
  183. return "UnsignedShiftRight";
  184. case TokenType::UnsignedShiftRightEquals:
  185. return "UnsignedShiftRightEquals";
  186. case TokenType::Var:
  187. return "Var";
  188. case TokenType::Void:
  189. return "Void";
  190. case TokenType::While:
  191. return "While";
  192. case TokenType::Yield:
  193. return "Yield";
  194. default:
  195. ASSERT_NOT_REACHED();
  196. return "<Unknown>";
  197. }
  198. }
  199. const char* Token::name() const
  200. {
  201. return name(m_type);
  202. }
  203. double Token::double_value() const
  204. {
  205. // FIXME: need to parse double instead of int
  206. bool ok;
  207. return m_value.to_int(ok);
  208. }
  209. String Token::string_value() const
  210. {
  211. // FIXME: unescape the string and remove quotes
  212. return m_value;
  213. }
  214. bool Token::bool_value() const
  215. {
  216. return m_value == "true";
  217. }
  218. }