blob: 21b67571f196116588eafc12208388c24ab0533c [file] [log] [blame]
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001//
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_MACRO_EXPANDER_H_
8#define COMPILER_PREPROCESSOR_MACRO_EXPANDER_H_
9
maxvujovic@gmail.com433f4aa2012-07-18 17:29:52 +000010#include <cassert>
alokp@chromium.orga19572c2012-06-15 16:30:08 +000011#include <memory>
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000012#include <vector>
13
alokp@chromium.org04d7d222012-05-16 19:24:07 +000014#include "Lexer.h"
alokp@chromium.org98d04ec2012-05-21 22:47:20 +000015#include "Macro.h"
alokp@chromium.org04d7d222012-05-16 19:24:07 +000016#include "pp_utils.h"
17
18namespace pp
19{
20
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000021class Diagnostics;
22
alokp@chromium.org04d7d222012-05-16 19:24:07 +000023class MacroExpander : public Lexer
24{
25 public:
alokp@chromium.org98d04ec2012-05-21 22:47:20 +000026 MacroExpander(Lexer* lexer, MacroSet* macroSet, Diagnostics* diagnostics);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000027 virtual ~MacroExpander();
alokp@chromium.org04d7d222012-05-16 19:24:07 +000028
29 virtual void lex(Token* token);
30
31 private:
32 PP_DISALLOW_COPY_AND_ASSIGN(MacroExpander);
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000033
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000034 void getToken(Token* token);
35 void ungetToken(const Token& token);
36 bool isNextTokenLeftParen();
37
38 bool pushMacro(const Macro& macro, const Token& identifier);
39 void popMacro();
40
41 bool expandMacro(const Macro& macro,
42 const Token& identifier,
43 std::vector<Token>* replacements);
44
45 typedef std::vector<Token> MacroArg;
46 bool collectMacroArgs(const Macro& macro,
47 const Token& identifier,
48 std::vector<MacroArg>* args);
49 void replaceMacroParams(const Macro& macro,
50 const std::vector<MacroArg>& args,
51 std::vector<Token>* replacements);
52
53 struct MacroContext
54 {
55 const Macro* macro;
daniel@transgaming.coma16a55f2012-12-20 20:51:54 +000056 std::size_t index;
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000057 std::vector<Token> replacements;
58
59 MacroContext() : macro(0), index(0) { }
60 bool empty() const { return index == replacements.size(); }
61 const Token& get() { return replacements[index++]; }
maxvujovic@gmail.com433f4aa2012-07-18 17:29:52 +000062 void unget() { assert(index > 0); --index; }
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000063 };
64
alokp@chromium.org04d7d222012-05-16 19:24:07 +000065 Lexer* mLexer;
alokp@chromium.org98d04ec2012-05-21 22:47:20 +000066 MacroSet* mMacroSet;
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000067 Diagnostics* mDiagnostics;
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000068
69 std::auto_ptr<Token> mReserveToken;
70 std::vector<MacroContext*> mContextStack;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000071};
72
73} // namespace pp
74#endif // COMPILER_PREPROCESSOR_MACRO_EXPANDER_H_
75