Token.h 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. // Copyright (c) 2008 Roberto Raggi <[email protected]>
  2. //
  3. // Permission is hereby granted, free of charge, to any person obtaining a copy
  4. // of this software and associated documentation files (the "Software"), to deal
  5. // in the Software without restriction, including without limitation the rights
  6. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. // copies of the Software, and to permit persons to whom the Software is
  8. // furnished to do so, subject to the following conditions:
  9. //
  10. // The above copyright notice and this permission notice shall be included in
  11. // all copies or substantial portions of the Software.
  12. //
  13. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  18. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  19. // THE SOFTWARE.
  20. #ifndef CPLUSPLUS_TOKEN_H
  21. #define CPLUSPLUS_TOKEN_H
  22. #include "CPlusPlusForwardDeclarations.h"
  23. namespace CPlusPlus {
  24. enum Kind {
  25. T_EOF_SYMBOL = 0,
  26. T_ERROR,
  27. T_CPP_COMMENT,
  28. T_CPP_DOXY_COMMENT,
  29. T_COMMENT,
  30. T_DOXY_COMMENT,
  31. T_IDENTIFIER,
  32. T_FIRST_LITERAL,
  33. T_NUMERIC_LITERAL = T_FIRST_LITERAL,
  34. T_FIRST_CHAR_LITERAL,
  35. T_CHAR_LITERAL = T_FIRST_CHAR_LITERAL,
  36. T_WIDE_CHAR_LITERAL,
  37. T_UTF16_CHAR_LITERAL,
  38. T_UTF32_CHAR_LITERAL,
  39. T_LAST_CHAR_LITERAL = T_UTF32_CHAR_LITERAL,
  40. T_FIRST_STRING_LITERAL,
  41. T_STRING_LITERAL = T_FIRST_STRING_LITERAL,
  42. T_WIDE_STRING_LITERAL,
  43. T_UTF8_STRING_LITERAL,
  44. T_UTF16_STRING_LITERAL,
  45. T_UTF32_STRING_LITERAL,
  46. T_RAW_STRING_LITERAL,
  47. T_RAW_WIDE_STRING_LITERAL,
  48. T_RAW_UTF8_STRING_LITERAL,
  49. T_RAW_UTF16_STRING_LITERAL,
  50. T_RAW_UTF32_STRING_LITERAL,
  51. T_AT_STRING_LITERAL,
  52. T_ANGLE_STRING_LITERAL,
  53. T_LAST_STRING_LITERAL = T_ANGLE_STRING_LITERAL,
  54. T_LAST_LITERAL = T_ANGLE_STRING_LITERAL,
  55. T_FIRST_OPERATOR,
  56. T_AMPER = T_FIRST_OPERATOR,
  57. T_AMPER_AMPER,
  58. T_AMPER_EQUAL,
  59. T_ARROW,
  60. T_ARROW_STAR,
  61. T_CARET,
  62. T_CARET_EQUAL,
  63. T_COLON,
  64. T_COLON_COLON,
  65. T_COMMA,
  66. T_SLASH,
  67. T_SLASH_EQUAL,
  68. T_DOT,
  69. T_DOT_DOT_DOT,
  70. T_DOT_STAR,
  71. T_EQUAL,
  72. T_EQUAL_EQUAL,
  73. T_EXCLAIM,
  74. T_EXCLAIM_EQUAL,
  75. T_GREATER,
  76. T_GREATER_EQUAL,
  77. T_GREATER_GREATER,
  78. T_GREATER_GREATER_EQUAL,
  79. T_LBRACE,
  80. T_LBRACKET,
  81. T_LESS,
  82. T_LESS_EQUAL,
  83. T_LESS_LESS,
  84. T_LESS_LESS_EQUAL,
  85. T_LPAREN,
  86. T_MINUS,
  87. T_MINUS_EQUAL,
  88. T_MINUS_MINUS,
  89. T_PERCENT,
  90. T_PERCENT_EQUAL,
  91. T_PIPE,
  92. T_PIPE_EQUAL,
  93. T_PIPE_PIPE,
  94. T_PLUS,
  95. T_PLUS_EQUAL,
  96. T_PLUS_PLUS,
  97. T_POUND,
  98. T_POUND_POUND,
  99. T_QUESTION,
  100. T_RBRACE,
  101. T_RBRACKET,
  102. T_RPAREN,
  103. T_SEMICOLON,
  104. T_STAR,
  105. T_STAR_EQUAL,
  106. T_TILDE,
  107. T_TILDE_EQUAL,
  108. T_LAST_OPERATOR = T_TILDE_EQUAL,
  109. T_FIRST_KEYWORD,
  110. T_ALIGNAS = T_FIRST_KEYWORD,
  111. T_ALIGNOF,
  112. T_ASM,
  113. T_AUTO,
  114. T_BREAK,
  115. T_CASE,
  116. T_CATCH,
  117. T_CLASS,
  118. T_CONST,
  119. T_CONST_CAST,
  120. T_CONSTEXPR,
  121. T_CONTINUE,
  122. T_DECLTYPE,
  123. T_DEFAULT,
  124. T_DELETE,
  125. T_DO,
  126. T_DYNAMIC_CAST,
  127. T_ELSE,
  128. T_ENUM,
  129. T_EXPLICIT,
  130. T_EXPORT,
  131. T_EXTERN,
  132. T_FALSE,
  133. T_FOR,
  134. T_FRIEND,
  135. T_GOTO,
  136. T_IF,
  137. T_INLINE,
  138. T_MUTABLE,
  139. T_NAMESPACE,
  140. T_NEW,
  141. T_NOEXCEPT,
  142. T_NULLPTR,
  143. T_OPERATOR,
  144. T_PRIVATE,
  145. T_PROTECTED,
  146. T_PUBLIC,
  147. T_REGISTER,
  148. T_REINTERPRET_CAST,
  149. T_RETURN,
  150. T_SIZEOF,
  151. T_STATIC,
  152. T_STATIC_ASSERT,
  153. T_STATIC_CAST,
  154. T_STRUCT,
  155. T_SWITCH,
  156. T_TEMPLATE,
  157. T_THIS,
  158. T_THREAD_LOCAL,
  159. T_THROW,
  160. T_TRUE,
  161. T_TRY,
  162. T_TYPEDEF,
  163. T_TYPEID,
  164. T_TYPENAME,
  165. T_UNION,
  166. T_USING,
  167. T_VIRTUAL,
  168. T_VOLATILE,
  169. T_WHILE,
  170. T___ATTRIBUTE__,
  171. T___THREAD,
  172. T___TYPEOF__,
  173. // obj c++ @ keywords
  174. T_FIRST_OBJC_AT_KEYWORD,
  175. T_AT_CATCH = T_FIRST_OBJC_AT_KEYWORD,
  176. T_AT_CLASS,
  177. T_AT_COMPATIBILITY_ALIAS,
  178. T_AT_DEFS,
  179. T_AT_DYNAMIC,
  180. T_AT_ENCODE,
  181. T_AT_END,
  182. T_AT_FINALLY,
  183. T_AT_IMPLEMENTATION,
  184. T_AT_INTERFACE,
  185. T_AT_NOT_KEYWORD,
  186. T_AT_OPTIONAL,
  187. T_AT_PACKAGE,
  188. T_AT_PRIVATE,
  189. T_AT_PROPERTY,
  190. T_AT_PROTECTED,
  191. T_AT_PROTOCOL,
  192. T_AT_PUBLIC,
  193. T_AT_REQUIRED,
  194. T_AT_SELECTOR,
  195. T_AT_SYNCHRONIZED,
  196. T_AT_SYNTHESIZE,
  197. T_AT_THROW,
  198. T_AT_TRY,
  199. T_LAST_OBJC_AT_KEYWORD = T_AT_TRY,
  200. // Primitive types
  201. T_FIRST_PRIMITIVE,
  202. T_BOOL = T_FIRST_PRIMITIVE,
  203. T_CHAR,
  204. T_CHAR16_T,
  205. T_CHAR32_T,
  206. T_DOUBLE,
  207. T_FLOAT,
  208. T_INT,
  209. T_LONG,
  210. T_SHORT,
  211. T_SIGNED,
  212. T_UNSIGNED,
  213. T_VOID,
  214. T_WCHAR_T,
  215. T_LAST_PRIMITIVE = T_WCHAR_T,
  216. // Qt keywords
  217. T_FIRST_QT_KEYWORD,
  218. T_EMIT = T_FIRST_QT_KEYWORD,
  219. T_SIGNAL,
  220. T_SLOT,
  221. T_Q_SIGNAL,
  222. T_Q_SLOT,
  223. T_Q_SIGNALS,
  224. T_Q_SLOTS,
  225. T_Q_FOREACH,
  226. T_Q_D,
  227. T_Q_Q,
  228. T_Q_INVOKABLE,
  229. T_Q_PROPERTY,
  230. T_Q_PRIVATE_PROPERTY,
  231. T_Q_INTERFACES,
  232. T_Q_EMIT,
  233. T_Q_ENUMS,
  234. T_Q_FLAGS,
  235. T_Q_PRIVATE_SLOT,
  236. T_Q_DECLARE_INTERFACE,
  237. T_Q_OBJECT,
  238. T_Q_GADGET,
  239. T_LAST_QT_KEYWORD = T_Q_GADGET,
  240. T_LAST_KEYWORD = T_LAST_QT_KEYWORD,
  241. // aliases
  242. T_OR = T_PIPE_PIPE,
  243. T_AND = T_AMPER_AMPER,
  244. T_NOT = T_EXCLAIM,
  245. T_XOR = T_CARET,
  246. T_BITOR = T_PIPE,
  247. T_COMPL = T_TILDE,
  248. T_OR_EQ = T_PIPE_EQUAL,
  249. T_AND_EQ = T_AMPER_EQUAL,
  250. T_BITAND = T_AMPER,
  251. T_NOT_EQ = T_EXCLAIM_EQUAL,
  252. T_XOR_EQ = T_CARET_EQUAL,
  253. T___ASM = T_ASM,
  254. T___ASM__ = T_ASM,
  255. T_TYPEOF = T___TYPEOF__,
  256. T___TYPEOF = T___TYPEOF__,
  257. T___DECLTYPE = T_DECLTYPE,
  258. T___INLINE = T_INLINE,
  259. T___INLINE__ = T_INLINE,
  260. T___CONST = T_CONST,
  261. T___CONST__ = T_CONST,
  262. T___VOLATILE = T_VOLATILE,
  263. T___VOLATILE__ = T_VOLATILE,
  264. T___ATTRIBUTE = T___ATTRIBUTE__
  265. };
  266. class CPLUSPLUS_EXPORT Token
  267. {
  268. public:
  269. Token() : flags(0), byteOffset(0), utf16charOffset(0), ptr(0) {}
  270. inline bool is(unsigned k) const { return f.kind == k; }
  271. inline bool isNot(unsigned k) const { return f.kind != k; }
  272. const char *spell() const;
  273. void reset();
  274. inline Kind kind() const { return static_cast<Kind>(f.kind); }
  275. inline bool newline() const { return f.newline; }
  276. inline bool whitespace() const { return f.whitespace; }
  277. inline bool joined() const { return f.joined; }
  278. inline bool expanded() const { return f.expanded; }
  279. inline bool generated() const { return f.generated; }
  280. inline unsigned bytes() const { return f.bytes; }
  281. inline unsigned bytesBegin() const { return byteOffset; }
  282. inline unsigned bytesEnd() const { return byteOffset + f.bytes; }
  283. inline unsigned utf16chars() const { return f.utf16chars; }
  284. inline unsigned utf16charsBegin() const { return utf16charOffset; }
  285. inline unsigned utf16charsEnd() const { return utf16charOffset + f.utf16chars; }
  286. inline bool isLiteral() const
  287. { return f.kind >= T_FIRST_LITERAL && f.kind <= T_LAST_LITERAL; }
  288. inline bool isCharLiteral() const
  289. { return f.kind >= T_FIRST_CHAR_LITERAL && f.kind <= T_LAST_CHAR_LITERAL; }
  290. inline bool isStringLiteral() const
  291. { return f.kind >= T_FIRST_STRING_LITERAL && f.kind <= T_LAST_STRING_LITERAL; }
  292. inline bool isOperator() const
  293. { return f.kind >= T_FIRST_OPERATOR && f.kind <= T_LAST_OPERATOR; }
  294. inline bool isKeyword() const
  295. { return f.kind >= T_FIRST_KEYWORD && f.kind < T_FIRST_PRIMITIVE; }
  296. inline bool isPrimitiveType() const
  297. { return f.kind >= T_FIRST_PRIMITIVE && f.kind <= T_LAST_PRIMITIVE; }
  298. inline bool isQtKeyword() const
  299. { return f.kind >= T_FIRST_QT_KEYWORD && f.kind <= T_LAST_QT_KEYWORD; }
  300. inline bool isComment() const
  301. { return f.kind == T_COMMENT || f.kind == T_DOXY_COMMENT ||
  302. f.kind == T_CPP_COMMENT || f.kind == T_CPP_DOXY_COMMENT; }
  303. inline bool isObjCAtKeyword() const
  304. { return f.kind >= T_FIRST_OBJC_AT_KEYWORD && f.kind <= T_LAST_OBJC_AT_KEYWORD; }
  305. static const char *name(int kind);
  306. public:
  307. struct Flags {
  308. // The token kind.
  309. unsigned kind : 8;
  310. // The token starts a new line.
  311. unsigned newline : 1;
  312. // The token is preceeded by whitespace(s).
  313. unsigned whitespace : 1;
  314. // The token is joined with the previous one.
  315. unsigned joined : 1;
  316. // The token originates from a macro expansion.
  317. unsigned expanded : 1;
  318. // The token originates from a macro expansion and does not correspond to an
  319. // argument that went through substitution. Notice the example:
  320. //
  321. // #define FOO(a, b) a + b;
  322. // FOO(1, 2)
  323. //
  324. // After preprocessing we would expect the following tokens: 1 + 2;
  325. // Tokens '1', '+', '2', and ';' are all expanded. However only tokens '+' and ';'
  326. // are generated.
  327. unsigned generated : 1;
  328. // Unused...
  329. unsigned pad : 3;
  330. // The token length in bytes and UTF16 chars.
  331. unsigned bytes : 16;
  332. unsigned utf16chars : 16;
  333. };
  334. union {
  335. unsigned long flags;
  336. Flags f;
  337. };
  338. unsigned byteOffset;
  339. unsigned utf16charOffset;
  340. union {
  341. void *ptr;
  342. const Literal *literal;
  343. const NumericLiteral *number;
  344. const StringLiteral *string;
  345. const Identifier *identifier;
  346. unsigned close_brace;
  347. unsigned lineno;
  348. };
  349. };
  350. struct LanguageFeatures
  351. {
  352. LanguageFeatures() : flags(0) {}
  353. union {
  354. unsigned int flags;
  355. struct {
  356. unsigned int qtEnabled : 1; // If Qt is used.
  357. unsigned int qtMocRunEnabled : 1;
  358. unsigned int qtKeywordsEnabled : 1; // If Qt is used but QT_NO_KEYWORDS defined
  359. unsigned int cxx11Enabled : 1;
  360. unsigned int objCEnabled : 1;
  361. unsigned int c99Enabled : 1;
  362. };
  363. };
  364. };
  365. } // namespace CPlusPlus
  366. #endif // CPLUSPLUS_TOKEN_H