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