#ifndef FORTRAN_USER_STATE_H_ #define FORTRAN_USER_STATE_H_ // Instances of ParseState (parse-state.h) incorporate instances of this // UserState class, which encapsulates any semantic information necessary for // parse tree construction so as to avoid any need for representing // state in static data. #include #include namespace Fortran { namespace parser { class UserState { public: using Label = std::uint64_t; bool IsDoLabel(Label label) const { return doLabels_.find(label) != doLabels_.end(); } bool InNonlabelDoConstruct() const { return nonlabelDoConstructNestingDepth_ > 0; } void NewDoLabel(Label label) { doLabels_.insert(label); } void NewSubprogram() { doLabels_.clear(); nonlabelDoConstructNestingDepth_ = 0; } void EnterNonlabelDoConstruct() { ++nonlabelDoConstructNestingDepth_; } void LeaveDoConstruct() { if (nonlabelDoConstructNestingDepth_ > 0) { --nonlabelDoConstructNestingDepth_; } } private: std::unordered_set