blob: 699b17b1947eb7a3b33090219476b3329ad3680d [file] [log] [blame]
//===--- TokenKinds.def - C Family Token Kind Database ----------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by Chris Lattner and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines the TokenKind database. This includes normal tokens like
// tok::ampamp (corresponding to the && token) as well as keywords for various
// languages. Users of this file must optionally #define the TOK, KEYWORD,
// ALIAS, or PPKEYWORD macros to make use of this file.
//
//===----------------------------------------------------------------------===//
#ifndef TOK
#define TOK(X)
#endif
#ifndef KEYWORD
#define KEYWORD(X,Y) TOK(kw_ ## X)
#endif
#ifndef ALIAS
#define ALIAS(X,Y)
#endif
#ifndef PPKEYWORD
#define PPKEYWORD(X)
#endif
#ifndef CXX_KEYWORD_OPERATOR
#define CXX_KEYWORD_OPERATOR(X,Y)
#endif
#ifndef OBJC1_AT_KEYWORD
#define OBJC1_AT_KEYWORD(X)
#endif
#ifndef OBJC2_AT_KEYWORD
#define OBJC2_AT_KEYWORD(X)
#endif
//===----------------------------------------------------------------------===//
// Preprocessor keywords.
//===----------------------------------------------------------------------===//
// These have meaning after a '#' at the start of a line. These define enums in
// the tok::pp_* namespace.
PPKEYWORD(not_keyword)
// C99 6.10.1 - Conditional Inclusion.
PPKEYWORD(if)
PPKEYWORD(ifdef)
PPKEYWORD(ifndef)
PPKEYWORD(elif)
PPKEYWORD(else)
PPKEYWORD(endif)
PPKEYWORD(defined)
// C99 6.10.2 - Source File Inclusion.
PPKEYWORD(include)
// C99 6.10.3 - Macro Replacement.
PPKEYWORD(define)
PPKEYWORD(undef)
// C99 6.10.4 - Line Control.
PPKEYWORD(line)
// C99 6.10.5 - Error Directive.
PPKEYWORD(error)
// C99 6.10.6 - Pragma Directive.
PPKEYWORD(pragma)
// GNU Extensions.
PPKEYWORD(import)
PPKEYWORD(include_next)
PPKEYWORD(warning)
PPKEYWORD(ident)
PPKEYWORD(sccs)
PPKEYWORD(assert)
PPKEYWORD(unassert)
// clang extensions.
PPKEYWORD(define_target)
PPKEYWORD(define_other_target)
//===----------------------------------------------------------------------===//
// Language keywords.
//===----------------------------------------------------------------------===//
// These define members of the tok::kw_* namespace.
TOK(unknown) // Not a token.
TOK(eof) // End of file.
TOK(eom) // End of macro (end of line inside a macro).
// C99 6.4.9: Comments.
TOK(comment) // Comment (only in -E -C[C] mode)
// C99 6.4.2: Identifiers.
TOK(identifier) // abcde123
// C99 6.4.4.1: Integer Constants
// C99 6.4.4.2: Floating Constants
TOK(numeric_constant) // 0x123
// C99 6.4.4: Character Constants
TOK(char_constant) // 'a' L'b'
// C99 6.4.5: String Literals.
TOK(string_literal) // "foo"
TOK(wide_string_literal) // L"foo"
TOK(angle_string_literal)// <foo>
// C99 6.4.6: Punctuators.
TOK(l_square) // [
TOK(r_square) // ]
TOK(l_paren) // (
TOK(r_paren) // )
TOK(l_brace) // {
TOK(r_brace) // }
TOK(period) // .
TOK(ellipsis) // ...
TOK(amp) // &
TOK(ampamp) // &&
TOK(ampequal) // &=
TOK(star) // *
TOK(starequal) // *=
TOK(plus) // +
TOK(plusplus) // ++
TOK(plusequal) // +=
TOK(minus) // -
TOK(arrow) // ->
TOK(minusminus) // --
TOK(minusequal) // -=
TOK(tilde) // ~
TOK(exclaim) // !
TOK(exclaimequal) // !=
TOK(slash) // /
TOK(slashequal) // /=
TOK(percent) // %
TOK(percentequal) // %=
TOK(less) // <
TOK(lessless) // <<
TOK(lessequal) // <=
TOK(lesslessequal) // <<=
TOK(greater) // >
TOK(greatergreater) // >>
TOK(greaterequal) // >=
TOK(greatergreaterequal) // >>=
TOK(caret) // ^
TOK(caretequal) // ^=
TOK(pipe) // |
TOK(pipepipe) // ||
TOK(pipeequal) // |=
TOK(question) // ?
TOK(colon) // :
TOK(semi) // ;
TOK(equal) // =
TOK(equalequal) // ==
TOK(comma) // ,
TOK(hash) // #
TOK(hashhash) // ##
TOK(hashat) // #@
// C++ Support
TOK(periodstar) // .*
TOK(arrowstar) // ->*
TOK(coloncolon) // ::
// Objective C support.
TOK(at) // @
// at_identifier // @foo
// at_string // @"foo"
// C99 6.4.1: Keywords. These turn into kw_* tokens.
// Flags allowed:
// NOTC90 - In C90, this token is never available.
// EXTC90 - In C90, this token is an extension that is enabled unless strict.
// NOTC99 - In C99, this token is never available.
// EXTC99 - In C99, this token is an extension that is enabled unless strict.
// NOTCPP - In C++98, this token is never available.
// EXTCPP - In C++98, this token is an extension that is enabled unless strict.
// NOTCPP0x - In C++0x, this token is never available.
// EXTCPP0x - In C++0x, this token is an extension that is enabled unless
// strict.
//
KEYWORD(auto , 0)
KEYWORD(break , 0)
KEYWORD(case , 0)
KEYWORD(char , 0)
KEYWORD(const , 0)
KEYWORD(continue , 0)
KEYWORD(default , 0)
KEYWORD(do , 0)
KEYWORD(double , 0)
KEYWORD(else , 0)
KEYWORD(enum , 0)
KEYWORD(extern , 0)
KEYWORD(float , 0)
KEYWORD(for , 0)
KEYWORD(goto , 0)
KEYWORD(if , 0)
KEYWORD(inline , EXTC90) // Ext in C90, ok in C99/C++
KEYWORD(int , 0)
KEYWORD(long , 0)
KEYWORD(register , 0)
KEYWORD(restrict , EXTC90) // Ext in C90
KEYWORD(return , 0)
KEYWORD(short , 0)
KEYWORD(signed , 0)
KEYWORD(sizeof , 0)
KEYWORD(static , 0)
KEYWORD(struct , 0)
KEYWORD(switch , 0)
KEYWORD(typedef , 0)
KEYWORD(union , 0)
KEYWORD(unsigned , 0)
KEYWORD(void , 0)
KEYWORD(volatile , 0)
KEYWORD(while , 0)
KEYWORD(_Bool , EXTC90|EXTCPP|EXTCPP0x) // C99 only
KEYWORD(_Complex , EXTC90|EXTCPP|EXTCPP0x) // C99 only
KEYWORD(_Imaginary , EXTC90|NOTCPP|NOTCPP0x) // C90 only
// Special tokens to the compiler.
KEYWORD(__func__ , EXTC90|EXTCPP|EXTCPP0x) // Only in C99.
KEYWORD(__FUNCTION__ , EXTC90|EXTC99|EXTCPP|EXTCPP0x) // GCC Extension.
KEYWORD(__PRETTY_FUNCTION__ , EXTC90|EXTC99|EXTCPP|EXTCPP0x) // GCC Extension.
// C++ 2.11p1: Keywords.
KEYWORD(asm , EXTC90|EXTC99) // Exts in C90/C99
KEYWORD(bool , NOTC90|NOTC99)
KEYWORD(catch , NOTC90|NOTC99)
KEYWORD(class , NOTC90|NOTC99)
KEYWORD(const_cast , NOTC90|NOTC99)
KEYWORD(delete , NOTC90|NOTC99)
KEYWORD(dynamic_cast , NOTC90|NOTC99)
KEYWORD(explicit , NOTC90|NOTC99)
KEYWORD(export , NOTC90|NOTC99)
KEYWORD(false , NOTC90|NOTC99)
KEYWORD(friend , NOTC90|NOTC99)
KEYWORD(mutable , NOTC90|NOTC99)
KEYWORD(namespace , NOTC90|NOTC99)
KEYWORD(new , NOTC90|NOTC99)
KEYWORD(operator , NOTC90|NOTC99)
KEYWORD(private , NOTC90|NOTC99)
KEYWORD(protected , NOTC90|NOTC99)
KEYWORD(public , NOTC90|NOTC99)
KEYWORD(reinterpret_cast , NOTC90|NOTC99)
KEYWORD(static_cast , NOTC90|NOTC99)
KEYWORD(template , NOTC90|NOTC99)
KEYWORD(this , NOTC90|NOTC99)
KEYWORD(throw , NOTC90|NOTC99)
KEYWORD(true , NOTC90|NOTC99)
KEYWORD(try , NOTC90|NOTC99)
KEYWORD(typename , NOTC90|NOTC99)
KEYWORD(typeid , NOTC90|NOTC99)
KEYWORD(using , NOTC90|NOTC99)
KEYWORD(virtual , NOTC90|NOTC99)
KEYWORD(wchar_t , NOTC90|NOTC99)
// C++ 2.5p2: Alternative Representations.
CXX_KEYWORD_OPERATOR(and , ampamp)
CXX_KEYWORD_OPERATOR(and_eq , ampequal)
CXX_KEYWORD_OPERATOR(bitand , amp)
CXX_KEYWORD_OPERATOR(bitor , pipe)
CXX_KEYWORD_OPERATOR(compl , tilde)
CXX_KEYWORD_OPERATOR(not , exclaim)
CXX_KEYWORD_OPERATOR(not_eq , exclaimequal)
CXX_KEYWORD_OPERATOR(or , pipepipe)
CXX_KEYWORD_OPERATOR(or_eq , pipeequal)
CXX_KEYWORD_OPERATOR(xor , caret)
CXX_KEYWORD_OPERATOR(xor_eq , caretequal)
// C++0x keywords
KEYWORD(char16_t , NOTC90|NOTC99|NOTCPP)
KEYWORD(char32_t , NOTC90|NOTC99|NOTCPP)
KEYWORD(static_assert , NOTC90|NOTC99|NOTCPP)
// GNU Extensions.
KEYWORD(_Decimal32 , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(_Decimal64 , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(_Decimal128 , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(typeof , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(__null , NOTC90|NOTC99|EXTCPP|EXTCPP0x) // C++-only Extensn
KEYWORD(__alignof , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(__attribute , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(__builtin_choose_expr , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(__builtin_offsetof , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(__builtin_types_compatible_p, EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(__builtin_va_arg , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(__extension__ , 0) // Not treated as an extension!
KEYWORD(__imag , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(__label__ , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(__real , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
KEYWORD(__thread , EXTC90|EXTC99|EXTCPP|EXTCPP0x)
// Alternate spelling for various tokens. There are GCC extensions in all
// languages, but should not be disabled in strict conformance mode.
ALIAS("__attribute__", __attribute)
ALIAS("__const" , const )
ALIAS("__const__" , const )
ALIAS("__alignof__" , __alignof )
ALIAS("__asm" , asm )
ALIAS("__asm__" , asm )
ALIAS("__complex" , _Complex )
ALIAS("__complex__" , _Complex )
ALIAS("__imag__" , __imag )
ALIAS("__inline" , inline )
ALIAS("__inline__" , inline )
ALIAS("__real__" , __real )
ALIAS("__restrict" , restrict )
ALIAS("__restrict__" , restrict )
ALIAS("__signed" , signed )
ALIAS("__signed__" , signed )
ALIAS("__typeof" , typeof )
ALIAS("__typeof__" , typeof )
ALIAS("__volatile" , volatile )
ALIAS("__volatile__" , volatile )
//===----------------------------------------------------------------------===//
// Objective-C @-preceeded keywords.
//===----------------------------------------------------------------------===//
// These have meaning after an '@' in Objective-C mode. These define enums in
// the tok::objc_* namespace.
OBJC1_AT_KEYWORD(not_keyword)
OBJC1_AT_KEYWORD(class)
OBJC1_AT_KEYWORD(compatibility_alias)
OBJC1_AT_KEYWORD(defs)
OBJC1_AT_KEYWORD(encode)
OBJC1_AT_KEYWORD(end)
OBJC1_AT_KEYWORD(implementation)
OBJC1_AT_KEYWORD(interface)
OBJC1_AT_KEYWORD(private)
OBJC1_AT_KEYWORD(protected)
OBJC1_AT_KEYWORD(protocol)
OBJC1_AT_KEYWORD(public)
OBJC1_AT_KEYWORD(selector)
OBJC1_AT_KEYWORD(throw)
OBJC1_AT_KEYWORD(try)
OBJC1_AT_KEYWORD(catch)
OBJC1_AT_KEYWORD(finally)
OBJC1_AT_KEYWORD(synchronized)
// I'm guessing this is an objc2 keyword, what are the others?
OBJC2_AT_KEYWORD(property)
// TODO: What to do about context-sensitive keywords like:
// bycopy/byref/in/inout/oneway/out?
#undef OBJC2_AT_KEYWORD
#undef OBJC1_AT_KEYWORD
#undef CXX_KEYWORD_OPERATOR
#undef PPKEYWORD
#undef ALIAS
#undef KEYWORD
#undef TOK