// // Created by Bobby Lucero on 5/21/23. // #pragma once #include "Lexer.h" #include template struct Visitor; template struct Expr{ virtual T accept(Visitor* visitor) = 0; virtual ~Expr(){} }; template struct BinaryExpr : Expr { const std::shared_ptr > left; const Token oper; const std::shared_ptr > right; BinaryExpr(std::shared_ptr > left, Token oper, std::shared_ptr > right) : left(left), oper(oper), right(right) { } T accept(Visitor* visitor) override{ return visitor->visitBinaryExpr(this); } }; template struct GroupingExpr : Expr { const std::shared_ptr > expression; GroupingExpr(std::shared_ptr > expression) : expression(expression) { } T accept(Visitor* visitor) override{ return visitor->visitGroupingExpr(this); } }; template struct LiteralExpr : Expr { const std::string value; const bool isNumber; LiteralExpr(std::string value, bool isNumber) : value(value), isNumber(isNumber) { } T accept(Visitor* visitor) override{ return visitor->visitLiteralExpr(this); } }; template struct UnaryExpr : Expr { const Token oper; const std::shared_ptr > right; UnaryExpr(Token oper, std::shared_ptr > right) : oper(oper), right(right) { } T accept(Visitor* visitor) override{ return visitor->visitUnaryExpr(this); } }; //// template struct Visitor { virtual T visitBinaryExpr(BinaryExpr* expression) = 0; virtual T visitGroupingExpr(GroupingExpr* expression) = 0; virtual T visitLiteralExpr(LiteralExpr* expression) = 0; virtual T visitUnaryExpr(UnaryExpr* expression) = 0; };