104d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org//
288f6e946b97ee15fe199e3fa151174c0bfeaa895Jamie Madill// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
304d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org// Use of this source code is governed by a BSD-style license that can be
404d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org// found in the LICENSE file.
504d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org//
604d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
704d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org#ifndef COMPILER_PREPROCESSOR_TOKENIZER_H_
804d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org#define COMPILER_PREPROCESSOR_TOKENIZER_H_
904d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
1004d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org#include "Input.h"
1104d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org#include "Lexer.h"
1204d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org#include "pp_utils.h"
1304d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
1404d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.orgnamespace pp
1504d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org{
1604d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
172c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.orgclass Diagnostics;
182c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org
1904d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.orgclass Tokenizer : public Lexer
2004d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org{
2104d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org  public:
2204d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org    struct Context
2304d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org    {
24d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo        Diagnostics *diagnostics;
252c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org
2604d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org        Input input;
2704d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org        // The location where yytext points to. Token location should track
2804d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org        // scanLoc instead of Input::mReadLoc because they may not be the same
2904d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org        // if text is buffered up in the scanner input buffer.
3004d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org        Input::Location scanLoc;
3104d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
3204d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org        bool leadingSpace;
3304d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org        bool lineStart;
3404d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org    };
3504d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
36d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    Tokenizer(Diagnostics *diagnostics);
3704d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org    ~Tokenizer();
3804d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
39d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    bool init(size_t count, const char * const string[], const int length[]);
4046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org
4146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org    void setFileNumber(int file);
4246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org    void setLineNumber(int line);
435508f39d0cffc9a68565bbff2e6f61332a509cdfJamie Madill    void setMaxTokenSize(size_t maxTokenSize);
4446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org
45d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    virtual void lex(Token *token);
4604d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
4704d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org  private:
4804d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org    PP_DISALLOW_COPY_AND_ASSIGN(Tokenizer);
4904d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org    bool initScanner();
5004d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org    void destroyScanner();
5104d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
52d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void *mHandle;  // Scanner handle.
5304d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org    Context mContext;  // Scanner extra.
545508f39d0cffc9a68565bbff2e6f61332a509cdfJamie Madill    size_t mMaxTokenSize; // Maximum token size
5504d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org};
5604d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
5704d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org}  // namespace pp
5804d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org#endif  // COMPILER_PREPROCESSOR_TOKENIZER_H_
5904d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
60