cppToken.cxx 7.7 KB

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