Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

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