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
14namespace angle
15{
16
17namespace pp
18{
19
20class Diagnostics;
21
22class 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