use crate::expr::{BinaryExpr, CallExpr, ExprValue, LogicalExpr, UnaryExpr, VariableExpr};
use crate::stmt::{
AssignStmt, BinaryAssignStmt, ExpressionStmt, ForStmt, IfStmt, InputStmt, PrintStmt,
ReturnStmt, WhileStmt,
};
pub(crate) trait StmtVisitor<U> {
fn visit_expression_stmt(&mut self, stmt: &ExpressionStmt, line: usize) -> U;
fn visit_print_stmt(&mut self, stmt: &PrintStmt, line: usize) -> U;
fn visit_input_stmt(&mut self, stmt: &InputStmt, line: usize) -> U;
fn visit_assign_stmt(&mut self, stmt: &AssignStmt, line: usize) -> U;
fn visit_if_stmt(&mut self, stmt: &IfStmt, line: usize) -> U;
fn visit_while_stmt(&mut self, stmt: &WhileStmt, line: usize) -> U;
fn visit_for_stmt(&mut self, stmt: &ForStmt, line: usize) -> U;
fn visit_return_stmt(&mut self, stmt: &ReturnStmt, line: usize) -> U;
fn visit_binary_assign_stmt(&mut self, stmt: &BinaryAssignStmt, line: usize) -> U;
}
pub(crate) trait ExprVisitor<U> {
fn visit_variable_expr(&mut self, expr: &VariableExpr) -> U;
fn visit_logical_expr(&mut self, expr: &LogicalExpr) -> U;
fn visit_binary_expr(&mut self, expr: &BinaryExpr) -> U;
fn visit_unary_expr(&mut self, expr: &UnaryExpr) -> U;
fn visit_call_expr(&mut self, expr: &CallExpr) -> U;
fn visit_literal_expr(&mut self, expr: &ExprValue) -> U;
}