1//
2// Copyright (c) 2012 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_DIRECTIVE_PARSER_H_
8#define COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_
9
10#include "Lexer.h"
11#include "Macro.h"
12#include "pp_utils.h"
13#include "SourceLocation.h"
14
15namespace pp
16{
17
18class Diagnostics;
19class DirectiveHandler;
20class Tokenizer;
21
22class DirectiveParser : public Lexer
23{
24  public:
25    DirectiveParser(Tokenizer *tokenizer,
26                    MacroSet *macroSet,
27                    Diagnostics *diagnostics,
28                    DirectiveHandler *directiveHandler);
29
30    virtual void lex(Token *token);
31
32  private:
33    PP_DISALLOW_COPY_AND_ASSIGN(DirectiveParser);
34
35    void parseDirective(Token *token);
36    void parseDefine(Token *token);
37    void parseUndef(Token *token);
38    void parseIf(Token *token);
39    void parseIfdef(Token *token);
40    void parseIfndef(Token *token);
41    void parseElse(Token *token);
42    void parseElif(Token *token);
43    void parseEndif(Token *token);
44    void parseError(Token *token);
45    void parsePragma(Token *token);
46    void parseExtension(Token *token);
47    void parseVersion(Token *token);
48    void parseLine(Token *token);
49
50    bool skipping() const;
51    void parseConditionalIf(Token *token);
52    int parseExpressionIf(Token *token);
53    int parseExpressionIfdef(Token *token);
54
55    struct ConditionalBlock
56    {
57        std::string type;
58        SourceLocation location;
59        bool skipBlock;
60        bool skipGroup;
61        bool foundValidGroup;
62        bool foundElseGroup;
63
64        ConditionalBlock()
65            : skipBlock(false),
66              skipGroup(false),
67              foundValidGroup(false),
68              foundElseGroup(false)
69        {
70        }
71    };
72    bool mPastFirstStatement;
73    std::vector<ConditionalBlock> mConditionalStack;
74    Tokenizer *mTokenizer;
75    MacroSet *mMacroSet;
76    Diagnostics *mDiagnostics;
77    DirectiveHandler *mDirectiveHandler;
78};
79
80}  // namespace pp
81#endif  // COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_
82
83