Token.h revision ef3b215c946d4813408b5fe872fe2baa3b246b00
1d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner//===--- Token.h - Token interface ------------------------------*- C++ -*-===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
10d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner//  This file defines the Token interface.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
14d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner#ifndef LLVM_CLANG_TOKEN_H
15d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner#define LLVM_CLANG_TOKEN_H
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TokenKinds.h"
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/SourceLocation.h"
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass IdentifierInfo;
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
24d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner/// Token - This structure provides full information about a lexed token.
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// It is not intended to be space efficient, it is intended to return as much
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// information as possible about each returned token.  This is expected to be
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// compressed into a smaller form if memory footprint is important.
28d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnerclass Token {
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// The location and length of the token text itself.
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation Loc;
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned Length;
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// IdentifierInfo - If this was an identifier, this points to the uniqued
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// information about this identifier.
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo *IdentInfo;
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Kind - The actual flavor of token this is.
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
398e748ab52395328f2905855b295a22e33dc800b2Ted Kremenek  unsigned Kind : 8;  // DON'T make Kind a 'tok::TokenKind';
408e748ab52395328f2905855b295a22e33dc800b2Ted Kremenek                      // MSVC will treat it as a signed char and
418e748ab52395328f2905855b295a22e33dc800b2Ted Kremenek                      // TokenKinds > 127 won't be handled correctly.
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Flags - Bits we track about this token, members of the TokenFlags enum.
445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned Flags : 8;
455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Various flags set per token:
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  enum TokenFlags {
495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    StartOfLine   = 0x01,  // At start of line or only after whitespace.
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    LeadingSpace  = 0x02,  // Whitespace exists before this token.
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    DisableExpand = 0x04,  // This identifier may never be macro expanded.
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    NeedsCleaning = 0x08   // Contained an escaped newline or trigraph.
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  };
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
558e748ab52395328f2905855b295a22e33dc800b2Ted Kremenek  tok::TokenKind getKind() const { return (tok::TokenKind)Kind; }
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void setKind(tok::TokenKind K) { Kind = K; }
57000732226610650837478cba97843d19b75f648eChris Lattner
58000732226610650837478cba97843d19b75f648eChris Lattner  /// is/isNot - Predicates to check if this token is a specific kind, as in
59000732226610650837478cba97843d19b75f648eChris Lattner  /// "if (Tok.is(tok::l_brace)) {...}".
608e748ab52395328f2905855b295a22e33dc800b2Ted Kremenek  bool is(tok::TokenKind K) const { return Kind == (unsigned) K; }
618e748ab52395328f2905855b295a22e33dc800b2Ted Kremenek  bool isNot(tok::TokenKind K) const { return Kind != (unsigned) K; }
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getLocation - Return a source location identifier for the specified
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// offset in the current file.
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation getLocation() const { return Loc; }
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned getLength() const { return Length; }
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void setLocation(SourceLocation L) { Loc = L; }
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void setLength(unsigned Len) { Length = Len; }
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
718e748ab52395328f2905855b295a22e33dc800b2Ted Kremenek  const char *getName() const {
728e748ab52395328f2905855b295a22e33dc800b2Ted Kremenek    return tok::getTokenName( (tok::TokenKind) Kind);
738e748ab52395328f2905855b295a22e33dc800b2Ted Kremenek  }
745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// startToken - Reset all flags to cleared.
765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void startToken() {
785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Flags = 0;
795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    IdentInfo = 0;
805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Loc = SourceLocation();
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo *getIdentifierInfo() const { return IdentInfo; }
845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void setIdentifierInfo(IdentifierInfo *II) {
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    IdentInfo = II;
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8753702cd401b8fdca985aede7732c2f6a82ad9b1cChris Lattner
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// setFlag - Set the specified flag.
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void setFlag(TokenFlags Flag) {
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Flags |= Flag;
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// clearFlag - Unset the specified flag.
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void clearFlag(TokenFlags Flag) {
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Flags &= ~Flag;
965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
97ef3b215c946d4813408b5fe872fe2baa3b246b00Ted Kremenek
98ef3b215c946d4813408b5fe872fe2baa3b246b00Ted Kremenek  /// getFlags - Return the internal represtation of the flags.
99ef3b215c946d4813408b5fe872fe2baa3b246b00Ted Kremenek  ///  Only intended for low-level operations such as writing tokens to
100ef3b215c946d4813408b5fe872fe2baa3b246b00Ted Kremenek  //   disk.
101ef3b215c946d4813408b5fe872fe2baa3b246b00Ted Kremenek  unsigned getFlags() const {
102ef3b215c946d4813408b5fe872fe2baa3b246b00Ted Kremenek    return Flags;
103ef3b215c946d4813408b5fe872fe2baa3b246b00Ted Kremenek  }
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// setFlagValue - Set a flag to either true or false.
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void setFlagValue(TokenFlags Flag, bool Val) {
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (Val)
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      setFlag(Flag);
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      clearFlag(Flag);
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isAtStartOfLine - Return true if this token is at the start of a line.
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
115b8128140956c6f8f0ab143818775a81f4b4aa477Chris Lattner  bool isAtStartOfLine() const { return (Flags & StartOfLine) ? true : false; }
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// hasLeadingSpace - Return true if this token has whitespace before it.
1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
119b8128140956c6f8f0ab143818775a81f4b4aa477Chris Lattner  bool hasLeadingSpace() const { return (Flags & LeadingSpace) ? true : false; }
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isExpandDisabled - Return true if this identifier token should never
1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// be expanded in the future, due to C99 6.10.3.4p2.
1238e748ab52395328f2905855b295a22e33dc800b2Ted Kremenek  bool isExpandDisabled() const {
1248e748ab52395328f2905855b295a22e33dc800b2Ted Kremenek    return (Flags & DisableExpand) ? true : false;
1258e748ab52395328f2905855b295a22e33dc800b2Ted Kremenek  }
126861cf3effdc0fbc97d401539bc3050da76b2476fSteve Naroff
127861cf3effdc0fbc97d401539bc3050da76b2476fSteve Naroff  /// isObjCAtKeyword - Return true if we have an ObjC keyword identifier.
128861cf3effdc0fbc97d401539bc3050da76b2476fSteve Naroff  bool isObjCAtKeyword(tok::ObjCKeywordKind objcKey) const;
129861cf3effdc0fbc97d401539bc3050da76b2476fSteve Naroff
130861cf3effdc0fbc97d401539bc3050da76b2476fSteve Naroff  /// getObjCKeywordID - Return the ObjC keyword kind.
131861cf3effdc0fbc97d401539bc3050da76b2476fSteve Naroff  tok::ObjCKeywordKind getObjCKeywordID() const;
132861cf3effdc0fbc97d401539bc3050da76b2476fSteve Naroff
1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// needsCleaning - Return true if this token has trigraphs or escaped
1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// newlines in it.
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
136b8128140956c6f8f0ab143818775a81f4b4aa477Chris Lattner  bool needsCleaning() const { return (Flags & NeedsCleaning) ? true : false; }
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// PPConditionalInfo - Information about the conditional stack (#if directives)
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// currently active.
1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstruct PPConditionalInfo {
1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// IfLoc - Location where the conditional started.
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  SourceLocation IfLoc;
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// WasSkipping - True if this was contained in a skipping directive, e.g.
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// in a "#if 0" block.
1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool WasSkipping;
1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// FoundNonSkip - True if we have emitted tokens already, and now we're in
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// an #else block or something.  Only useful in Skipping blocks.
1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool FoundNonSkip;
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// FoundElse - True if we've seen a #else in this block.  If so,
1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// #elif/#else directives are not allowed.
1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool FoundElse;
1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
162