bool Pre(const parser::CharBlock &) { return true; }
void Post(const parser::CharBlock &) {}
+ template<typename T> bool Pre(const parser::Statement<T> &) { return true; }
+ template<typename T> void Post(const parser::Statement<T> &) {}
template<typename T> bool Pre(const parser::UnlabeledStatement<T> &) {
return true;
}
}
}
+template<typename T, typename V> void Walk(const Statement<T> &x, V &visitor) {
+ if (visitor.Pre(x)) {
+ // N.B. The label, if any, is not visited.
+ Walk(x.source, visitor);
+ Walk(x.statement, visitor);
+ visitor.Post(x);
+ }
+}
+template<typename T, typename M> void Walk(Statement<T> &x, M &mutator) {
+ if (mutator.Pre(x)) {
+ // N.B. The label, if any, is not visited.
+ Walk(x.source, mutator);
+ Walk(x.statement, mutator);
+ mutator.Post(x);
+ }
+}
+
template<typename T, typename V>
void Walk(const UnlabeledStatement<T> &x, V &visitor) {
if (visitor.Pre(x)) {
// unlabeledStatement() is basically statement() for those few situations
// in Fortran where a statement cannot have a label.
template<typename PA> inline constexpr auto unlabeledStatement(const PA &p) {
- return skipStuffBeforeStatement >>
- sourced(
- construct<UnlabeledStatement<typename PA::resultType>>(space >> p)) /
- endOfStmt;
+ return space >>
+ sourced(construct<UnlabeledStatement<typename PA::resultType>>(p));
}
// This unambiguousStatement() variant of statement() provides better error