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