]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
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 | /// IsIdentifierStringPrefix - Return true if the spelling of the token | |
67 | /// is literally 'L', 'u', 'U', or 'u8'. | |
68 | bool IsIdentifierStringPrefix(const Token &Tok) const; | |
69 | }; | |
70 | } // end clang namespace | |
71 | ||
72 | #endif |