Lines Matching refs:parser
23 using namespace parser::literals;
42 void Post(parser::Name &);
43 bool Pre(parser::MainProgram &);
44 bool Pre(parser::FunctionSubprogram &);
45 bool Pre(parser::SubroutineSubprogram &);
46 bool Pre(parser::SeparateModuleSubprogram &);
47 bool Pre(parser::BlockConstruct &);
48 bool Pre(parser::ActionStmt &);
49 void Post(parser::ReadStmt &);
50 void Post(parser::WriteStmt &);
54 bool Pre(parser::EquivalenceStmt &) { return false; }
55 bool Pre(parser::Keyword &) { return false; }
56 bool Pre(parser::EntryStmt &) { return false; }
57 bool Pre(parser::CompilerDirective &) { return false; }
60 bool Pre(parser::EndBlockDataStmt &) { return false; }
61 bool Pre(parser::EndFunctionStmt &) { return false; }
62 bool Pre(parser::EndInterfaceStmt &) { return false; }
63 bool Pre(parser::EndModuleStmt &) { return false; }
64 bool Pre(parser::EndMpSubprogramStmt &) { return false; }
65 bool Pre(parser::EndProgramStmt &) { return false; }
66 bool Pre(parser::EndSubmoduleStmt &) { return false; }
67 bool Pre(parser::EndSubroutineStmt &) { return false; }
68 bool Pre(parser::EndTypeStmt &) { return false; }
71 void FixMisparsedStmtFuncs(parser::SpecificationPart &, parser::Block &);
75 parser::Messages &messages_;
79 void RewriteMutator::Post(parser::Name &name) {
103 parser::SpecificationPart &specPart, parser::Block &block) {
104 auto &list{std::get<std::list<parser::DeclarationConstruct>>(specPart.t)};
109 parser::Statement<common::Indirection<parser::StmtFunctionStmt>>>(
112 symbol{std::get<parser::Name>(stmt->statement.value().t).symbol}) {
120 parser::ExecutionPartConstruct{
121 parser::ExecutableConstruct{std::move(newStmt)}});
133 bool RewriteMutator::Pre(parser::MainProgram &program) {
134 FixMisparsedStmtFuncs(std::get<parser::SpecificationPart>(program.t),
135 std::get<parser::ExecutionPart>(program.t).v);
139 bool RewriteMutator::Pre(parser::FunctionSubprogram &func) {
140 FixMisparsedStmtFuncs(std::get<parser::SpecificationPart>(func.t),
141 std::get<parser::ExecutionPart>(func.t).v);
145 bool RewriteMutator::Pre(parser::SubroutineSubprogram &subr) {
146 FixMisparsedStmtFuncs(std::get<parser::SpecificationPart>(subr.t),
147 std::get<parser::ExecutionPart>(subr.t).v);
151 bool RewriteMutator::Pre(parser::SeparateModuleSubprogram &subp) {
152 FixMisparsedStmtFuncs(std::get<parser::SpecificationPart>(subp.t),
153 std::get<parser::ExecutionPart>(subp.t).v);
157 bool RewriteMutator::Pre(parser::BlockConstruct &block) {
158 FixMisparsedStmtFuncs(std::get<parser::BlockSpecificationPart>(block.t).v,
159 std::get<parser::Block>(block.t));
164 bool RewriteMutator::Pre(parser::ActionStmt &x) {
165 if (auto *print{std::get_if<common::Indirection<parser::PrintStmt>>(&x.u)};
167 std::get<std::list<parser::OutputItem>>(print->value().t).empty()) {
168 auto &format{std::get<parser::Format>(print->value().t)};
169 if (std::holds_alternative<parser::Expr>(format.u)) {
170 if (auto *name{parser::Unwrap<parser::Name>(format)}; name &&
175 std::list<parser::IoControlSpec> controls;
177 x.u = common::Indirection<parser::WriteStmt>::Make(
178 parser::IoUnit{parser::Star{}}, std::optional<parser::Format>{},
179 std::move(controls), std::list<parser::OutputItem>{});
193 std::holds_alternative<parser::Expr>(x.format->u)) {
194 if (const parser::Name * name{parser::Unwrap<parser::Name>(x.format)}) {
196 x.controls.emplace_front(parser::IoControlSpec{std::move(*name)});
207 void RewriteMutator::Post(parser::ReadStmt &x) {
209 if (auto *var{std::get_if<parser::Variable>(&x.iounit->u)}) {
210 const parser::Name &last{parser::GetLastName(*var)};
215 return parser::Expr{std::move(indirection)};
225 void RewriteMutator::Post(parser::WriteStmt &x) {
229 bool RewriteParseTree(SemanticsContext &context, parser::Program &program) {
231 parser::Walk(program, mutator);