package com.visitors;

import com.ast.Block;
import com.ast.Program;
import com.ast.expressions.Call;
import com.ast.expressions.Subexpression;
import com.ast.expressions.binary.*;
import com.ast.expressions.literals.Literal;
import com.ast.expressions.unary.UnaryExpression;
import com.ast.function.Function;
import com.ast.function.ParamDeclaration;
import com.ast.function.ParamDeclarationList;
import com.ast.mutable.Identifier;
import com.ast.mutable.Mutable;
import com.ast.statements.*;
import com.ast.types.TypeDeclaration;
import com.exceptions.TypeCheckException;

public interface Visitor {
    void visit(Block element) throws TypeCheckException;
    void visit(BinaryExpression element) throws TypeCheckException;
    void visit(Call element) throws TypeCheckException;
    void visit(Literal element) throws TypeCheckException;
    void visit(Subexpression element) throws TypeCheckException;
    void visit(UnaryExpression element) throws TypeCheckException;
    void visit(Function element) throws TypeCheckException;
    void visit(ParamDeclaration element) throws TypeCheckException;
    void visit(ParamDeclarationList element) throws TypeCheckException;
    void visit(Identifier element) throws TypeCheckException;
    void visit(Program element);
    void visit(Assign element) throws TypeCheckException;
    void visit(Mutable element) throws TypeCheckException;
    void visit(If element) throws TypeCheckException;
    void visit(Input element) throws TypeCheckException;
    void visit(Output element) throws TypeCheckException;
    void visit(Return element) throws TypeCheckException;
    void visit(VariableDeclaration element) throws TypeCheckException;
    void visit(While element) throws TypeCheckException;
    void visit(TypeDeclaration element) throws TypeCheckException;

    /* Binary expressions */
    void visit(Add expression) throws TypeCheckException;
    void visit(And expression) throws TypeCheckException;
    void visit(Divide expression) throws TypeCheckException;
    void visit(Equals expression) throws TypeCheckException;
    void visit(LessThan expression) throws TypeCheckException;
    void visit(LessThanOrEquals expression) throws TypeCheckException;
    void visit(Modulo expression) throws TypeCheckException;
    void visit(Multiply expression) throws TypeCheckException;
    void visit(NotEquals expression) throws TypeCheckException;
    void visit(Or expression) throws TypeCheckException;
    void visit(Subtract expression) throws TypeCheckException;
}

@@ -210,23 +210,55 @@
 iterals.
-Literal
+*;%0Aimport com.ast.expressions.unary.Not
 ;%0Aimport
@@ -515,24 +515,51 @@
 atements.*;%0A
+import com.ast.types.Type;%0A
 import com.a
@@ -1876,25 +1876,22 @@
 Binary e
-xpression
+lement
 s */%0A   
@@ -1907,25 +1907,22 @@
 it(Add e
-xpression
+lement
 ) throws
@@ -1962,25 +1962,22 @@
 it(And e
-xpression
+lement
 ) throws
@@ -2020,25 +2020,22 @@
 Divide e
-xpression
+lement
 ) throws
@@ -2074,33 +2074,30 @@
 sit(Equals e
-xpression
+lement
 ) throws Typ
@@ -2138,25 +2138,22 @@
 ssThan e
-xpression
+lement
 ) throws
@@ -2202,33 +2202,30 @@
 anOrEquals e
-xpression
+lement
 ) throws Typ
@@ -2264,25 +2264,22 @@
 Modulo e
-xpression
+lement
 ) throws
@@ -2324,25 +2324,22 @@
 ltiply e
-xpression
+lement
 ) throws
@@ -2389,137 +2389,496 @@
 ls e
-xpression) throws TypeCheckException;%0A    void visit(Or expression) throws TypeCheckException;%0A    void visit(Subtract expression
+lement) throws TypeCheckException;%0A    void visit(Or element) throws TypeCheckException;%0A    void visit(Subtract element) throws TypeCheckException;%0A%0A    /* Literal Expressions */%0A    void visit(BoolLiteral element) throws TypeCheckException;%0A    void visit(CharLiteral element) throws TypeCheckException;%0A    void visit(DoubleLiteral element) throws TypeCheckException;%0A    void visit(IntLiteral element) throws TypeCheckException;%0A%0A    /* Unary Expressions */%0A    void visit(Not element
 ) th

Add unary to visitor interface