Home | History | Annotate | Download | only in Lex
      1 //===--- TokenConcatenation.h - Token Concatenation Avoidance ---*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines the TokenConcatenation class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef CLANG_LEX_TOKEN_CONCATENATION_H
     15 #define CLANG_LEX_TOKEN_CONCATENATION_H
     16 
     17 #include "clang/Basic/TokenKinds.h"
     18 
     19 namespace clang {
     20   class Preprocessor;
     21   class Token;
     22 
     23   /// TokenConcatenation class, which answers the question of
     24   ///   "Is it safe to emit two tokens without a whitespace between them, or
     25   ///    would that cause implicit concatenation of the tokens?"
     26   ///
     27   /// For example, it emitting two identifiers "foo" and "bar" next to each
     28   /// other would cause the lexer to produce one "foobar" token.  Emitting "1"
     29   /// and ")" next to each other is safe.
     30   ///
     31   class TokenConcatenation {
     32     Preprocessor &PP;
     33 
     34     enum AvoidConcatInfo {
     35       /// By default, a token never needs to avoid concatenation.  Most tokens
     36       /// (e.g. ',', ')', etc) don't cause a problem when concatenated.
     37       aci_never_avoid_concat = 0,
     38 
     39       /// aci_custom_firstchar - AvoidConcat contains custom code to handle this
     40       /// token's requirements, and it needs to know the first character of the
     41       /// token.
     42       aci_custom_firstchar = 1,
     43 
     44       /// aci_custom - AvoidConcat contains custom code to handle this token's
     45       /// requirements, but it doesn't need to know the first character of the
     46       /// token.
     47       aci_custom = 2,
     48 
     49       /// aci_avoid_equal - Many tokens cannot be safely followed by an '='
     50       /// character.  For example, "<<" turns into "<<=" when followed by an =.
     51       aci_avoid_equal = 4
     52     };
     53 
     54     /// TokenInfo - This array contains information for each token on what
     55     /// action to take when avoiding concatenation of tokens in the AvoidConcat
     56     /// method.
     57     char TokenInfo[tok::NUM_TOKENS];
     58   public:
     59     TokenConcatenation(Preprocessor &PP);
     60 
     61     bool AvoidConcat(const Token &PrevPrevTok,
     62                      const Token &PrevTok,
     63                      const Token &Tok) const;
     64 
     65   private:
     66     /// StartsWithL - Return true if the spelling of this token starts with 'L'.
     67     bool StartsWithL(const Token &Tok) const;
     68 
     69     /// IsIdentifierL - Return true if the spelling of this token is literally
     70     /// 'L'.
     71     bool IsIdentifierL(const Token &Tok) const;
     72   };
     73   } // end clang namespace
     74 
     75 #endif
     76