39 lines
1.1 KiB
C
39 lines
1.1 KiB
C
|
#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 <cinttypes>
|
||
|
#include <unordered_set>
|
||
|
|
||
|
namespace Fortran {
|
||
|
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<Label> doLabels_;
|
||
|
int nonlabelDoConstructNestingDepth_{0};
|
||
|
};
|
||
|
}; // namespace Fortran
|
||
|
#endif // FORTRAN_USER_STATE_H_
|