104d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org//
204d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org// Copyright (c) 2012 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_DIRECTIVE_PARSER_H_
804d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org#define COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_
904d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
1004d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org#include "Lexer.h"
1198d04ec8e2db023e04818c4af97b5e613af3f55calokp@chromium.org#include "Macro.h"
1204d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org#include "pp_utils.h"
13d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org#include "SourceLocation.h"
1404d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
1504d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.orgnamespace pp
1604d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org{
1704d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
182c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.orgclass Diagnostics;
1936124de8ce9855c1cfdfb6529b47822e12123274alokp@chromium.orgclass DirectiveHandler;
2004d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.orgclass Tokenizer;
2104d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
2204d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.orgclass DirectiveParser : public Lexer
2304d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org{
2404d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org  public:
25d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    DirectiveParser(Tokenizer *tokenizer,
26d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo                    MacroSet *macroSet,
27d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo                    Diagnostics *diagnostics,
28d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo                    DirectiveHandler *directiveHandler);
2904d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
30d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    virtual void lex(Token *token);
3104d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
3204d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org  private:
3304d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org    PP_DISALLOW_COPY_AND_ASSIGN(DirectiveParser);
3404d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
35d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseDirective(Token *token);
36d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseDefine(Token *token);
37d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseUndef(Token *token);
38d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseIf(Token *token);
39d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseIfdef(Token *token);
40d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseIfndef(Token *token);
41d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseElse(Token *token);
42d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseElif(Token *token);
43d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseEndif(Token *token);
44d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseError(Token *token);
45d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parsePragma(Token *token);
46d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseExtension(Token *token);
47d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseVersion(Token *token);
48d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseLine(Token *token);
4904d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
50d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    bool skipping() const;
51d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    void parseConditionalIf(Token *token);
52d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    int parseExpressionIf(Token *token);
53d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    int parseExpressionIfdef(Token *token);
54d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
55d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    struct ConditionalBlock
56d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    {
57d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org        std::string type;
58d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org        SourceLocation location;
59d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org        bool skipBlock;
60d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org        bool skipGroup;
61d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org        bool foundValidGroup;
62d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org        bool foundElseGroup;
63d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org
64d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo        ConditionalBlock()
65d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo            : skipBlock(false),
66d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo              skipGroup(false),
67d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo              foundValidGroup(false),
68d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo              foundElseGroup(false)
69d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org        {
70d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org        }
71d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    };
72d0d9f87ac02955ae496b5cc51d5dffb693b31a87alokp@chromium.org    bool mPastFirstStatement;
73d39ec4c15d6e656e027d7ded7ffceaafa0608e89alokp@chromium.org    std::vector<ConditionalBlock> mConditionalStack;
74d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    Tokenizer *mTokenizer;
75d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    MacroSet *mMacroSet;
76d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    Diagnostics *mDiagnostics;
77d526f9895c0aa867adb74a78e53832a9240c6ad6Zhenyao Mo    DirectiveHandler *mDirectiveHandler;
7804d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org};
7904d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
8004d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org}  // namespace pp
8104d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org#endif  // COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_
8204d7d22bb835408a82600244e09b9dcacbc0fa11alokp@chromium.org
83