1 | // |
2 | // Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved. |
3 | // Use of this source code is governed by a BSD-style license that can be |
4 | // found in the LICENSE file. |
5 | // |
6 | |
7 | #ifndef COMPILER_PREPROCESSOR_TOKENIZER_H_ |
8 | #define COMPILER_PREPROCESSOR_TOKENIZER_H_ |
9 | |
10 | #include "common/angleutils.h" |
11 | #include "compiler/preprocessor/Input.h" |
12 | #include "compiler/preprocessor/Lexer.h" |
13 | |
14 | namespace angle |
15 | { |
16 | |
17 | namespace pp |
18 | { |
19 | |
20 | class Diagnostics; |
21 | |
22 | class Tokenizer : public Lexer |
23 | { |
24 | public: |
25 | struct Context |
26 | { |
27 | Diagnostics *diagnostics; |
28 | |
29 | Input input; |
30 | // The location where yytext points to. Token location should track |
31 | // scanLoc instead of Input::mReadLoc because they may not be the same |
32 | // if text is buffered up in the scanner input buffer. |
33 | Input::Location scanLoc; |
34 | |
35 | bool leadingSpace; |
36 | bool lineStart; |
37 | }; |
38 | |
39 | Tokenizer(Diagnostics *diagnostics); |
40 | ~Tokenizer() override; |
41 | |
42 | bool init(size_t count, const char *const string[], const int length[]); |
43 | |
44 | void setFileNumber(int file); |
45 | void setLineNumber(int line); |
46 | void setMaxTokenSize(size_t maxTokenSize); |
47 | |
48 | void lex(Token *token) override; |
49 | |
50 | private: |
51 | bool initScanner(); |
52 | void destroyScanner(); |
53 | |
54 | void *mHandle; // Scanner handle. |
55 | Context mContext; // Scanner extra. |
56 | size_t mMaxTokenSize; // Maximum token size |
57 | }; |
58 | |
59 | } // namespace pp |
60 | |
61 | } // namespace angle |
62 | |
63 | #endif // COMPILER_PREPROCESSOR_TOKENIZER_H_ |
64 | |