plsm-cpp/compiler/include/AST/BaseASTVisitor.h
2024-12-25 21:07:15 +01:00

190 lines
5.0 KiB
C++

#pragma once
#include "AST/AST.h"
namespace plsm {
namespace ast {
class BaseASTVisitor : public ASTVisitor {
public:
BaseASTVisitor() : ASTVisitor() {};
virtual std::any visit(BinExpr &binExpr, std::any param) override {
if (binExpr.lhs.get())
binExpr.lhs->accept(this, param);
if (binExpr.rhs.get())
binExpr.rhs->accept(this, param);
return std::any();
}
virtual std::any visit(CallExpr &callExpr, std::any param) override {
if (callExpr.callee.get())
callExpr.callee->accept(this, param);
for (auto &arg : callExpr.args) {
if (arg.get())
arg->accept(this, param);
}
return std::any();
}
virtual std::any visit(CastExpr &castExpr, std::any param) override {
if (castExpr.value.get())
castExpr.value->accept(this, param);
if (castExpr.typeName.get())
castExpr.typeName->accept(this, param);
return std::any();
}
virtual std::any visit(Identifier &identifier, std::any param) override { return std::any(); }
virtual std::any visit(LambdaExpr &lambdaExpr, std::any param) override {
if (lambdaExpr.returnTypeName.get())
lambdaExpr.returnTypeName->accept(this, param);
for (auto &p : lambdaExpr.params) {
if (p.get())
p->accept(this, param);
}
if (lambdaExpr.body.get())
lambdaExpr.body->accept(this, param);
return std::any();
}
virtual std::any visit(UnExpr &unExpr, std::any param) override {
if (unExpr.expr.get())
unExpr.expr->accept(this, param);
return std::any();
}
virtual std::any visit(IntValue &intValue, std::any param) override { return std::any(); }
virtual std::any visit(FloatValue &floatValue, std::any param) override { return std::any(); }
virtual std::any visit(StringValue &stringValue, std::any param) override { return std::any(); }
virtual std::any visit(Import &import, std::any param) override { return std::any(); }
virtual std::any visit(Module &module, std::any param) override {
for (auto &import : module.imports) {
import->accept(this, param);
}
for (auto &stmt : module.stmts) {
if (stmt.get())
stmt->accept(this, param);
}
return std::any();
}
virtual std::any visit(AssignStmt &assignStmt, std::any param) override {
if (assignStmt.lval.get())
assignStmt.lval->accept(this, param);
if (assignStmt.rval.get())
assignStmt.rval->accept(this, param);
return std::any();
}
virtual std::any visit(Block &block, std::any param) override {
for (auto &stmt : block.stmts) {
if (stmt.get())
stmt->accept(this, param);
}
return std::any();
}
virtual std::any visit(ExprStmt &exprStmt, std::any param) override {
if (exprStmt.expr.get())
exprStmt.expr->accept(this, param);
return std::any();
}
virtual std::any visit(FnParam &fnParam, std::any param) override {
if (fnParam.typeName.get())
fnParam.typeName->accept(this, param);
return std::any();
}
virtual std::any visit(FnDecl &fnDecl, std::any param) override {
if (fnDecl.returnTypeName.get())
fnDecl.returnTypeName->accept(this, param);
for (auto &p : fnDecl.params) {
if (p.get())
p->accept(this, param);
}
if (fnDecl.body.get())
fnDecl.body->accept(this, param);
return std::any();
}
virtual std::any visit(IfStmt &ifStmt, std::any param) override {
if (ifStmt.condition.get())
ifStmt.condition->accept(this, param);
if (ifStmt.ifBody.get())
ifStmt.ifBody->accept(this, param);
if (ifStmt.elseBody.get())
ifStmt.elseBody->accept(this, param);
return std::any();
}
virtual std::any visit(InlineAsmConstraint &inlineAsmConstraint, std::any param) override {
if (inlineAsmConstraint.value.get())
inlineAsmConstraint.value->accept(this, param);
return std::any();
}
virtual std::any visit(InlineAsm &inlineAsm, std::any param) override {
for (auto &c : inlineAsm.outputs) {
if (c.get())
c->accept(this, param);
}
for (auto &c : inlineAsm.inputs) {
if (c.get())
c->accept(this, param);
}
return std::any();
}
virtual std::any visit(RetStmt &retStmt, std::any param) override {
if (retStmt.value.get())
retStmt.value->accept(this, param);
return std::any();
}
virtual std::any visit(VarDecl &varDecl, std::any param) override {
if (varDecl.typeName.get())
varDecl.typeName->accept(this, param);
return std::any();
}
virtual std::any visit(WhileStmt &whileStmt, std::any param) override {
if (whileStmt.condition.get())
whileStmt.condition->accept(this, param);
if (whileStmt.body.get())
whileStmt.body->accept(this, param);
return std::any();
}
virtual std::any visit(NamedTypeName &namedTypeName, std::any param) override { return std::any(); }
virtual std::any visit(PointerTypeName &pointerTypeName, std::any param) override {
if (pointerTypeName.baseTypeName.get())
pointerTypeName.baseTypeName->accept(this, param);
return std::any();
}
};
} // namespace ast
} // namespace plsm