52 lines
1.1 KiB
Plaintext
52 lines
1.1 KiB
Plaintext
template <typename T>
|
|
struct BinaryExpr : Expr<T>, Visitor<T>
|
|
{
|
|
const Expr<T> left;
|
|
const Token oper;
|
|
const Expr<T> right;
|
|
|
|
BinaryExpr(Expr<T> left, Token oper, Expr<T> right) : left(left), oper(oper), right(right)
|
|
{
|
|
}
|
|
T accept(Visitor<T> visitor){
|
|
return visitor.visitBinaryExpr(this);
|
|
}
|
|
};
|
|
template <typename T>
|
|
struct GroupingExpr : Expr<T>, Visitor<T>
|
|
{
|
|
const Expr<T> expression;
|
|
|
|
GroupingExpr(Expr<T> expression) : expression(expression)
|
|
{
|
|
}
|
|
T accept(Visitor<T> visitor){
|
|
return visitor.visitGroupingExpr(this);
|
|
}
|
|
};
|
|
template <typename T>
|
|
struct LiteralExpr : Expr<T>, Visitor<T>
|
|
{
|
|
const std::string value;
|
|
|
|
LiteralExpr(std::string value) : value(value)
|
|
{
|
|
}
|
|
T accept(Visitor<T> visitor){
|
|
return visitor.visitLiteralExpr(this);
|
|
}
|
|
};
|
|
template <typename T>
|
|
struct UnaryExpr : Expr<T>, Visitor<T>
|
|
{
|
|
const Token oper;
|
|
const Expr<T> right;
|
|
|
|
UnaryExpr(Token oper, Expr<T> right) : oper(oper), right(right)
|
|
{
|
|
}
|
|
T accept(Visitor<T> visitor){
|
|
return visitor.visitUnaryExpr(this);
|
|
}
|
|
};
|