package Compiler;

import java.util.List;

abstract class Statement {

    static class ExpressionStatement extends Statement{
        ExpressionStatement(Expression expr){
            this.expr = expr;
        }


        final Expression expr;

        @Override
        public String getStatmentType() {
            return "exprStmt";
        }
    }

    static class IfStatement extends Statement{
        IfStatement(Expression condition, List<Statement> statements,List<Statement> elseStatements){
            this.condition=condition;
            this.statements=statements;
            this.elseStatements=elseStatements;
        }

        final Expression condition;
        final List<Statement> statements;
        final List<Statement> elseStatements;

        @Override
        public String getStatmentType() {
            return "ifStmt";
        }
    }


    static class VariableDeclaration extends Statement{
        VariableDeclaration(Token name,String type){
            this.name=name;
            this.type=type;
        }


        final Token name;
        final String type;

        @Override
        public String getStatmentType() {
            return "varDec";
        }

    }

    static class StringDeclaration extends Statement{
        StringDeclaration(Token name,Expression length){
            this.name=name;
            this.length=length;
        }


        final Token name;
        final Expression length;

        @Override
        public String getStatmentType() {
            return "stringDec";
        }

    }

    static class PrintStatement extends Statement{
        PrintStatement(List<Expression> exprList){
            this.exprList=exprList;
        }
        final List<Expression> exprList;

        @Override
        public String getStatmentType() {
            return "print";
        }
    }


    public abstract String getStatmentType();
}