148 lines
3.4 KiB
C++
148 lines
3.4 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 {
|
|
binExpr.lhs->accept(this, param);
|
|
binExpr.rhs->accept(this, param);
|
|
return std::any();
|
|
}
|
|
|
|
virtual std::any visit(CallExpr &callExpr, std::any param) override {
|
|
callExpr.callee->accept(this, param);
|
|
|
|
for (auto &arg : callExpr.args) {
|
|
arg->accept(this, param);
|
|
}
|
|
|
|
return std::any();
|
|
}
|
|
|
|
virtual std::any visit(CastExpr &castExpr, std::any param) override {
|
|
castExpr.value->accept(this, param);
|
|
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 {
|
|
for (auto ¶m : lambdaExpr.params) {
|
|
param->accept(this, param);
|
|
}
|
|
|
|
for (auto &body : lambdaExpr.body) {
|
|
body->accept(this, param);
|
|
}
|
|
|
|
return std::any();
|
|
}
|
|
|
|
virtual std::any visit(UnExpr &unExpr, std::any param) override {
|
|
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(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) {
|
|
stmt->accept(this, param);
|
|
}
|
|
|
|
return std::any();
|
|
}
|
|
|
|
virtual std::any visit(AssignStmt &assignStmt, std::any param) override {
|
|
assignStmt.lval->accept(this, param);
|
|
assignStmt.rval->accept(this, param);
|
|
return std::any();
|
|
}
|
|
|
|
virtual std::any visit(ExprStmt &exprStmt, std::any param) override {
|
|
exprStmt.expr->accept(this, param);
|
|
return std::any();
|
|
}
|
|
|
|
virtual std::any visit(FnParam &fnParam, std::any param) override {
|
|
fnParam.typeName->accept(this, param);
|
|
return std::any();
|
|
}
|
|
|
|
virtual std::any visit(FnDecl &fnDecl, std::any param) override {
|
|
for (auto ¶m : fnDecl.params) {
|
|
param->accept(this, param);
|
|
}
|
|
|
|
for (auto &body : fnDecl.body) {
|
|
body->accept(this, param);
|
|
}
|
|
|
|
return std::any();
|
|
}
|
|
|
|
virtual std::any visit(IfStmt &ifStmt, std::any param) override {
|
|
ifStmt.condition->accept(this, param);
|
|
|
|
for (auto &ifBody : ifStmt.ifBody) {
|
|
ifBody->accept(this, param);
|
|
}
|
|
|
|
for (auto &elseBody : ifStmt.elseBody) {
|
|
elseBody->accept(this, param);
|
|
}
|
|
|
|
return std::any();
|
|
}
|
|
|
|
virtual std::any visit(RetStmt &retStmt, std::any param) override {
|
|
retStmt.value->accept(this, param);
|
|
return std::any();
|
|
}
|
|
|
|
virtual std::any visit(VarDecl &varDecl, std::any param) override {
|
|
varDecl.typeName->accept(this, param);
|
|
return std::any();
|
|
}
|
|
|
|
virtual std::any visit(WhileStmt &whileStmt, std::any param) override {
|
|
whileStmt.condition->accept(this, param);
|
|
|
|
for (auto &body : whileStmt.body) {
|
|
body->accept(this, param);
|
|
}
|
|
|
|
return std::any();
|
|
}
|
|
|
|
virtual std::any visit(PrimitiveTypeName &primitiveTypeName,
|
|
std::any param) override {
|
|
return std::any();
|
|
}
|
|
};
|
|
|
|
} // namespace ast
|
|
} // namespace plsm
|