blob: 5a0c7751a80c78fce6a108b33539f95ccde31306 [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
Geoff Lang0a73dd82014-11-19 16:18:08 -05007#ifndef COMPILER_PREPROCESSOR_MACROEXPANDER_H_
8#define COMPILER_PREPROCESSOR_MACROEXPANDER_H_
alokp@chromium.org04d7d222012-05-16 19:24:07 +00009
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:
Zhenyao Mod526f982014-05-13 14:51:19 -070026 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
Zhenyao Mod526f982014-05-13 14:51:19 -070029 virtual void lex(Token *token);
alokp@chromium.org04d7d222012-05-16 19:24:07 +000030
31 private:
32 PP_DISALLOW_COPY_AND_ASSIGN(MacroExpander);
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000033
Zhenyao Mod526f982014-05-13 14:51:19 -070034 void getToken(Token *token);
35 void ungetToken(const Token &token);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000036 bool isNextTokenLeftParen();
37
Zhenyao Mod526f982014-05-13 14:51:19 -070038 bool pushMacro(const Macro &macro, const Token &identifier);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000039 void popMacro();
40
Zhenyao Mod526f982014-05-13 14:51:19 -070041 bool expandMacro(const Macro &macro,
42 const Token &identifier,
43 std::vector<Token> *replacements);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000044
45 typedef std::vector<Token> MacroArg;
Zhenyao Mod526f982014-05-13 14:51:19 -070046 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);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000052
53 struct MacroContext
54 {
Zhenyao Mod526f982014-05-13 14:51:19 -070055 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
Zhenyao Mod526f982014-05-13 14:51:19 -070059 MacroContext()
60 : macro(0),
61 index(0)
62 {
63 }
64 bool empty() const
65 {
66 return index == replacements.size();
67 }
68 const Token &get()
69 {
70 return replacements[index++];
71 }
72 void unget()
73 {
74 assert(index > 0);
75 --index;
76 }
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000077 };
78
Zhenyao Mod526f982014-05-13 14:51:19 -070079 Lexer *mLexer;
80 MacroSet *mMacroSet;
81 Diagnostics *mDiagnostics;
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000082
83 std::auto_ptr<Token> mReserveToken;
Zhenyao Mod526f982014-05-13 14:51:19 -070084 std::vector<MacroContext *> mContextStack;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000085};
86
87} // namespace pp
alokp@chromium.org04d7d222012-05-16 19:24:07 +000088
Geoff Lang0a73dd82014-11-19 16:18:08 -050089#endif // COMPILER_PREPROCESSOR_MACROEXPANDER_H_