cppToken.cxx 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. // Filename: cppToken.cxx
  2. // Created by: drose (22Oct99)
  3. //
  4. ////////////////////////////////////////////////////////////////////
  5. //
  6. // PANDA 3D SOFTWARE
  7. // Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
  8. //
  9. // All use of this software is subject to the terms of the Panda 3d
  10. // Software license. You should have received a copy of this license
  11. // along with this source code; you will also find a current copy of
  12. // the license at http://www.panda3d.org/license.txt .
  13. //
  14. // To contact the maintainers of this program write to
  15. // [email protected] .
  16. //
  17. ////////////////////////////////////////////////////////////////////
  18. #include "cppToken.h"
  19. #include "cppIdentifier.h"
  20. #include "cppBison.h"
  21. #include <ctype.h>
  22. ////////////////////////////////////////////////////////////////////
  23. // Function: CPPToken::Constructor
  24. // Access: Public
  25. // Description:
  26. ////////////////////////////////////////////////////////////////////
  27. CPPToken::
  28. CPPToken(int token, int line_number, int col_number,
  29. const CPPFile &file, const string &str,
  30. const YYSTYPE &lval) :
  31. _token(token), _lval(lval)
  32. {
  33. _lval.str = str;
  34. _lloc.timestamp = 0;
  35. _lloc.first_line = line_number;
  36. _lloc.first_column = col_number;
  37. _lloc.last_line = line_number;
  38. _lloc.last_column = col_number;
  39. _lloc.text = NULL;
  40. _lloc.file = file;
  41. }
  42. ////////////////////////////////////////////////////////////////////
  43. // Function: CPPToken::Copy Constructor
  44. // Access: Public
  45. // Description:
  46. ////////////////////////////////////////////////////////////////////
  47. CPPToken::
  48. CPPToken(const CPPToken &copy) :
  49. _token(copy._token),
  50. _lloc(copy._lloc)
  51. {
  52. _lval.str = copy._lval.str;
  53. _lval.u = copy._lval.u;
  54. }
  55. ////////////////////////////////////////////////////////////////////
  56. // Function: CPPToken::Copy Assignment Operator
  57. // Access: Public
  58. // Description:
  59. ////////////////////////////////////////////////////////////////////
  60. void CPPToken::
  61. operator = (const CPPToken &copy) {
  62. _token = copy._token;
  63. _lval.str = copy._lval.str;
  64. _lval.u = copy._lval.u;
  65. _lloc = copy._lloc;
  66. }
  67. ////////////////////////////////////////////////////////////////////
  68. // Function: CPPToken::eof
  69. // Access: Public, Static
  70. // Description: A named constructor for the token returned when the
  71. // end of file has been reached.
  72. ////////////////////////////////////////////////////////////////////
  73. CPPToken CPPToken::
  74. eof() {
  75. return CPPToken(0);
  76. }
  77. ////////////////////////////////////////////////////////////////////
  78. // Function: CPPToken::is_eof
  79. // Access: Public
  80. // Description: Returns true if this is the EOF token.
  81. ////////////////////////////////////////////////////////////////////
  82. bool CPPToken::
  83. is_eof() const {
  84. return _token == 0;
  85. }
  86. ////////////////////////////////////////////////////////////////////
  87. // Function: CPPToken::output
  88. // Access: Public
  89. // Description:
  90. ////////////////////////////////////////////////////////////////////
  91. void CPPToken::
  92. output(ostream &out) const {
  93. switch (_token) {
  94. case REAL:
  95. out << "REAL " << _lval.u.real;
  96. break;
  97. case INTEGER:
  98. out << "INTEGER " << _lval.u.integer;
  99. break;
  100. case CHAR:
  101. out << "CHAR " << _lval.u.integer << " = " << _lval.str;
  102. break;
  103. case STRING:
  104. out << "STRING " << _lval.str;
  105. break;
  106. case SIMPLE_IDENTIFIER:
  107. out << "SIMPLE_IDENTIFIER " << _lval.str;
  108. break;
  109. case IDENTIFIER:
  110. out << "IDENTIFIER " << *_lval.u.identifier;
  111. break;
  112. case TYPENAME_IDENTIFIER:
  113. out << "TYPENAME_IDENTIFIER " << *_lval.u.identifier;
  114. break;
  115. case SCOPING:
  116. out << "SCOPING " << *_lval.u.identifier << "::";
  117. break;
  118. case TYPEDEFNAME:
  119. out << "TYPEDEFNAME " << _lval.str;
  120. break;
  121. case ELLIPSIS:
  122. out << "ELLIPSIS";
  123. break;
  124. case OROR:
  125. out << "OROR";
  126. break;
  127. case ANDAND:
  128. out << "ANDAND";
  129. break;
  130. case EQCOMPARE:
  131. out << "EQCOMPARE";
  132. break;
  133. case NECOMPARE:
  134. out << "NECOMPARE";
  135. break;
  136. case LECOMPARE:
  137. out << "LECOMPARE";
  138. break;
  139. case GECOMPARE:
  140. out << "GECOMPARE";
  141. break;
  142. case LSHIFT:
  143. out << "LSHIFT";
  144. break;
  145. case RSHIFT:
  146. out << "RSHIFT";
  147. break;
  148. case POINTSAT_STAR:
  149. out << "POINTSAT_STAR";
  150. break;
  151. case DOT_STAR:
  152. out << "DOT_STAR";
  153. break;
  154. case UNARY_NOT:
  155. out << "UNARY_NOT";
  156. break;
  157. case UNARY_MINUS:
  158. out << "UNARY_MINUS";
  159. break;
  160. case UNARY_NEGATE:
  161. out << "UNARY_NEGATE";
  162. break;
  163. case UNARY_STAR:
  164. out << "UNARY_STAR";
  165. break;
  166. case UNARY_REF:
  167. out << "UNARY_REF";
  168. break;
  169. case POINTSAT:
  170. out << "POINTSAT";
  171. break;
  172. case SCOPE:
  173. out << "SCOPE";
  174. break;
  175. case PLUSPLUS:
  176. out << "PLUSPLUS";
  177. break;
  178. case MINUSMINUS:
  179. out << "MINUSMINUS";
  180. break;
  181. case TIMESEQUAL:
  182. out << "TIMESEQUAL";
  183. break;
  184. case DIVIDEEQUAL:
  185. out << "DIVIDEEQUAL";
  186. break;
  187. case MODEQUAL:
  188. out << "MODEQUAL";
  189. break;
  190. case PLUSEQUAL:
  191. out << "PLUSEQUAL";
  192. break;
  193. case MINUSEQUAL:
  194. out << "MINUSEQUAL";
  195. break;
  196. case OREQUAL:
  197. out << "OREQUAL";
  198. break;
  199. case ANDEQUAL:
  200. out << "ANDEQUAL";
  201. break;
  202. case LSHIFTEQUAL:
  203. out << "LSHIFTEQUAL";
  204. break;
  205. case RSHIFTEQUAL:
  206. out << "RSHIFTEQUAL";
  207. break;
  208. case TOKENPASTE:
  209. out << "TOKENPASTE";
  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. }