cppToken.cxx 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. /**
  2. * PANDA 3D SOFTWARE
  3. * Copyright (c) Carnegie Mellon University. All rights reserved.
  4. *
  5. * All use of this software is subject to the terms of the revised BSD
  6. * license. You should have received a copy of this license along
  7. * with this source code in a file named "LICENSE."
  8. *
  9. * @file cppToken.cxx
  10. * @author drose
  11. * @date 1999-10-22
  12. */
  13. #include "cppToken.h"
  14. #include "cppExpression.h"
  15. #include "cppIdentifier.h"
  16. #include "cppBison.h"
  17. #include <ctype.h>
  18. /**
  19. *
  20. */
  21. CPPToken::
  22. CPPToken(int token, int line_number, int col_number,
  23. const CPPFile &file, const string &str,
  24. const YYSTYPE &lval) :
  25. _token(token), _lval(lval)
  26. {
  27. _lval.str = str;
  28. _lloc.first_line = line_number;
  29. _lloc.first_column = col_number;
  30. _lloc.last_line = line_number;
  31. _lloc.last_column = col_number;
  32. _lloc.file = file;
  33. }
  34. /**
  35. *
  36. */
  37. CPPToken::
  38. CPPToken(int token, const YYLTYPE &loc, const string &str, const YYSTYPE &val) :
  39. _token(token), _lval(val), _lloc(loc)
  40. {
  41. _lval.str = str;
  42. }
  43. /**
  44. *
  45. */
  46. CPPToken::
  47. CPPToken(const CPPToken &copy) :
  48. _token(copy._token),
  49. _lloc(copy._lloc)
  50. {
  51. _lval.str = copy._lval.str;
  52. _lval.u = copy._lval.u;
  53. }
  54. /**
  55. *
  56. */
  57. void CPPToken::
  58. operator = (const CPPToken &copy) {
  59. _token = copy._token;
  60. _lval.str = copy._lval.str;
  61. _lval.u = copy._lval.u;
  62. _lloc = copy._lloc;
  63. }
  64. /**
  65. * A named constructor for the token returned when the end of file has been
  66. * reached.
  67. */
  68. CPPToken CPPToken::
  69. eof() {
  70. return CPPToken(0);
  71. }
  72. /**
  73. * Returns true if this is the EOF token.
  74. */
  75. bool CPPToken::
  76. is_eof() const {
  77. return _token == 0;
  78. }
  79. /**
  80. *
  81. */
  82. void CPPToken::
  83. output(ostream &out) const {
  84. switch (_token) {
  85. case REAL:
  86. out << "REAL " << _lval.u.real;
  87. break;
  88. case INTEGER:
  89. out << "INTEGER " << _lval.u.integer;
  90. break;
  91. case CHAR_TOK:
  92. out << "CHAR_TOK " << _lval.u.integer << " = " << _lval.str;
  93. break;
  94. case SIMPLE_STRING:
  95. out << "SIMPLE_STRING " << _lval.str;
  96. break;
  97. case STRING_LITERAL:
  98. out << "STRING_LITERAL " << *_lval.u.expr;
  99. break;
  100. case SIMPLE_IDENTIFIER:
  101. out << "SIMPLE_IDENTIFIER " << _lval.str;
  102. break;
  103. case IDENTIFIER:
  104. out << "IDENTIFIER " << *_lval.u.identifier;
  105. break;
  106. case TYPENAME_IDENTIFIER:
  107. out << "TYPENAME_IDENTIFIER " << *_lval.u.identifier;
  108. break;
  109. case SCOPING:
  110. out << "SCOPING " << *_lval.u.identifier << "::";
  111. break;
  112. case TYPEDEFNAME:
  113. out << "TYPEDEFNAME " << _lval.str;
  114. break;
  115. case ELLIPSIS:
  116. out << "ELLIPSIS";
  117. break;
  118. case OROR:
  119. out << "OROR";
  120. break;
  121. case ANDAND:
  122. out << "ANDAND";
  123. break;
  124. case EQCOMPARE:
  125. out << "EQCOMPARE";
  126. break;
  127. case NECOMPARE:
  128. out << "NECOMPARE";
  129. break;
  130. case LECOMPARE:
  131. out << "LECOMPARE";
  132. break;
  133. case GECOMPARE:
  134. out << "GECOMPARE";
  135. break;
  136. case LSHIFT:
  137. out << "LSHIFT";
  138. break;
  139. case RSHIFT:
  140. out << "RSHIFT";
  141. break;
  142. case POINTSAT_STAR:
  143. out << "POINTSAT_STAR";
  144. break;
  145. case DOT_STAR:
  146. out << "DOT_STAR";
  147. break;
  148. case UNARY_NOT:
  149. out << "UNARY_NOT";
  150. break;
  151. case UNARY_MINUS:
  152. out << "UNARY_MINUS";
  153. break;
  154. case UNARY_PLUS:
  155. out << "UNARY_PLUS";
  156. break;
  157. case UNARY_NEGATE:
  158. out << "UNARY_NEGATE";
  159. break;
  160. case UNARY_STAR:
  161. out << "UNARY_STAR";
  162. break;
  163. case UNARY_REF:
  164. out << "UNARY_REF";
  165. break;
  166. case POINTSAT:
  167. out << "POINTSAT";
  168. break;
  169. case SCOPE:
  170. out << "SCOPE";
  171. break;
  172. case PLUSPLUS:
  173. out << "PLUSPLUS";
  174. break;
  175. case MINUSMINUS:
  176. out << "MINUSMINUS";
  177. break;
  178. case TIMESEQUAL:
  179. out << "TIMESEQUAL";
  180. break;
  181. case DIVIDEEQUAL:
  182. out << "DIVIDEEQUAL";
  183. break;
  184. case MODEQUAL:
  185. out << "MODEQUAL";
  186. break;
  187. case PLUSEQUAL:
  188. out << "PLUSEQUAL";
  189. break;
  190. case MINUSEQUAL:
  191. out << "MINUSEQUAL";
  192. break;
  193. case OREQUAL:
  194. out << "OREQUAL";
  195. break;
  196. case ANDEQUAL:
  197. out << "ANDEQUAL";
  198. break;
  199. case LSHIFTEQUAL:
  200. out << "LSHIFTEQUAL";
  201. break;
  202. case RSHIFTEQUAL:
  203. out << "RSHIFTEQUAL";
  204. break;
  205. case ATTR_LEFT:
  206. out << "ATTR_LEFT";
  207. break;
  208. case ATTR_RIGHT:
  209. out << "ATTR_RIGHT";
  210. break;
  211. case KW_BOOL:
  212. out << "KW_BOOL";
  213. break;
  214. case KW_CATCH:
  215. out << "KW_CATCH";
  216. break;
  217. case KW_CHAR:
  218. out << "KW_CHAR";
  219. break;
  220. case KW_CLASS:
  221. out << "KW_CLASS";
  222. break;
  223. case KW_CONST:
  224. out << "KW_CONST";
  225. break;
  226. case KW_DELETE:
  227. out << "KW_DELETE";
  228. break;
  229. case KW_DOUBLE:
  230. out << "KW_DOUBLE";
  231. break;
  232. case KW_DYNAMIC_CAST:
  233. out << "KW_DYNAMIC_CAST";
  234. break;
  235. case KW_ELSE:
  236. out << "KW_ELSE";
  237. break;
  238. case KW_ENUM:
  239. out << "KW_ENUM";
  240. break;
  241. case KW_EXPLICIT:
  242. out << "KW_EXPLICIT";
  243. break;
  244. case KW_EXTERN:
  245. out << "KW_EXTERN";
  246. break;
  247. case KW_FALSE:
  248. out << "KW_FALSE";
  249. break;
  250. case KW_FLOAT:
  251. out << "KW_FLOAT";
  252. break;
  253. case KW_FRIEND:
  254. out << "KW_FRIEND";
  255. break;
  256. case KW_FOR:
  257. out << "KW_FOR";
  258. break;
  259. case KW_GOTO:
  260. out << "KW_GOTO";
  261. break;
  262. case KW_IF:
  263. out << "KW_IF";
  264. break;
  265. case KW_INLINE:
  266. out << "KW_INLINE";
  267. break;
  268. case KW_INT:
  269. out << "KW_INT";
  270. break;
  271. case KW_LONG:
  272. out << "KW_LONG";
  273. break;
  274. case KW_MUTABLE:
  275. out << "KW_MUTABLE";
  276. break;
  277. case KW_NAMESPACE:
  278. out << "KW_NAMESPACE";
  279. break;
  280. case KW_NEW:
  281. out << "KW_NEW";
  282. break;
  283. case KW_OPERATOR:
  284. if (_lval.u.identifier != NULL) {
  285. out << *_lval.u.identifier << "::";
  286. }
  287. out << "KW_OPERATOR";
  288. break;
  289. case KW_PRIVATE:
  290. out << "KW_PRIVATE";
  291. break;
  292. case KW_PROTECTED:
  293. out << "KW_PROTECTED";
  294. break;
  295. case KW_PUBLIC:
  296. out << "KW_PUBLIC";
  297. break;
  298. case KW_REGISTER:
  299. out << "KW_REGISTER";
  300. break;
  301. case KW_RETURN:
  302. out << "KW_RETURN";
  303. break;
  304. case KW_SHORT:
  305. out << "KW_SHORT";
  306. break;
  307. case KW_SIGNED:
  308. out << "KW_SIGNED";
  309. break;
  310. case KW_SIZEOF:
  311. out << "KW_SIZEOF";
  312. break;
  313. case KW_STATIC:
  314. out << "KW_STATIC";
  315. break;
  316. case KW_STATIC_CAST:
  317. out << "KW_STATIC_CAST";
  318. break;
  319. case KW_STRUCT:
  320. out << "KW_STRUCT";
  321. break;
  322. case KW_TEMPLATE:
  323. out << "KW_TEMPLATE";
  324. break;
  325. case KW_THROW:
  326. out << "KW_THROW";
  327. break;
  328. case KW_TRUE:
  329. out << "KW_TRUE";
  330. break;
  331. case KW_TRY:
  332. out << "KW_TRY";
  333. break;
  334. case KW_TYPEDEF:
  335. out << "KW_TYPEDEF";
  336. break;
  337. case KW_TYPENAME:
  338. out << "KW_TYPENAME";
  339. break;
  340. case KW_USING:
  341. out << "KW_USING";
  342. break;
  343. case KW_UNION:
  344. out << "KW_UNION";
  345. break;
  346. case KW_UNSIGNED:
  347. out << "KW_UNSIGNED";
  348. break;
  349. case KW_VIRTUAL:
  350. out << "KW_VIRTUAL";
  351. break;
  352. case KW_VOID:
  353. out << "KW_VOID";
  354. break;
  355. case KW_VOLATILE:
  356. out << "KW_VOLATILE";
  357. break;
  358. case KW_WHILE:
  359. out << "KW_WHILE";
  360. break;
  361. case START_CPP:
  362. out << "START_CPP";
  363. break;
  364. case START_CONST_EXPR:
  365. out << "START_CONST_EXPR";
  366. break;
  367. case START_TYPE:
  368. out << "START_TYPE";
  369. break;
  370. default:
  371. if (_token < 128 && isprint(_token)) {
  372. out << "'" << (char)_token << "'";
  373. } else {
  374. out << "token " << _token << "\n";
  375. }
  376. }
  377. }