9#ifndef FORTRAN_PARSER_PREPROCESSOR_H_
10#define FORTRAN_PARSER_PREPROCESSOR_H_
18#include "flang/Parser/char-block.h"
19#include "flang/Parser/provenance.h"
20#include "flang/Parser/token-sequence.h"
21#include "llvm/Support/raw_ostream.h"
26#include <unordered_map>
39 std::size_t firstToken, std::size_t tokens,
bool isVariadic =
false);
42 bool isFunctionLike()
const {
return isFunctionLike_; }
43 std::size_t argumentCount()
const {
return argNames_.size(); }
44 bool isVariadic()
const {
return isVariadic_; }
45 bool isDisabled()
const {
return isDisabled_; }
46 bool isPredefined()
const {
return isPredefined_; }
47 const TokenSequence &replacement()
const {
return replacement_; }
49 bool set_isDisabled(
bool disable);
52 bool inIfExpression =
false);
54 void Print(llvm::raw_ostream &out,
const char *macroName =
"")
const;
57 static TokenSequence Tokenize(
const std::vector<std::string> &argNames,
58 const TokenSequence &token, std::size_t firstToken, std::size_t tokens);
62 std::size_t GetArgumentIndex(
const CharBlock &token)
const;
64 bool isFunctionLike_{
false};
65 bool isVariadic_{
false};
66 bool isDisabled_{
false};
67 bool isPredefined_{
false};
68 std::vector<std::string> argNames_;
77 const AllSources &allSources()
const {
return allSources_; }
78 AllSources &allSources() {
return allSources_; }
80 void DefineStandardMacros();
81 void Define(
const std::string ¯o,
const std::string &value);
82 void Undefine(std::string macro);
84 bool IsFunctionLikeDefinition(
const CharBlock &);
85 bool AnyDefinitions()
const {
return !definitions_.empty(); }
86 bool InConditional()
const {
return !ifStack_.empty(); }
95 std::optional<TokenSequence> MacroReplacement(
const TokenSequence &,
97 std::optional<std::size_t> *partialFunctionLikeMacro =
nullptr,
98 bool inIfExpression =
false);
103 void PrintMacros(llvm::raw_ostream &out)
const;
106 enum class IsElseActive { No, Yes };
107 enum class CanDeadElseAppear { No, Yes };
111 std::optional<std::size_t> *partialFunctionLikeMacro =
nullptr,
112 bool inIfExpression =
false);
113 void SkipDisabledConditionalCode(
115 bool IsIfPredicateTrue(
const TokenSequence &expr, std::size_t first,
120 std::list<std::string> names_;
121 std::unordered_map<CharBlock, Definition> definitions_;
122 std::stack<CanDeadElseAppear> ifStack_;
Definition: provenance.h:139
Definition: char-block.h:28
Definition: preprocessor.h:35
Definition: preprocessor.h:73
Definition: token-sequence.h:35
Definition: check-expression.h:19