DeclarationsNode declaration() {
		// Declarations = [�CONST� ident �=� Expression �;� {ident �=�
		// Expression �;�}]
		// [�TYPE� ident �=� Type �;� {ident �=� Type �;�}]
		// [�VAR� IdentList �:� Type �;� {IdentList �:� Type �;�}]
		// {ProcedureDeclaration �;�}
		
		ArrayList<ConstDeclarationNode> consts = new ArrayList<ConstDeclarationNode>();
	    List<TypeDeclarationNode> types = new ArrayList<TypeDeclarationNode>();
	    List<VarDeclarationNode> vars = new ArrayList<VarDeclarationNode>();
	    List<AbstractNode> procDeclarations = new ArrayList<AbstractNode>();
	    AbstractNode arg1;
	    AbstractNode arg2;

		if (test(CONST)) {
			read(CONST, "const");
			arg1 = constIdent();
			read(EQ, "=");
			arg2 = expr();
			read(SEMICOLON, ";");
			consts.add(new ConstDeclarationNode(arg1,arg2));
			while (test(IDENT)) {
				arg1 = constIdent();
				read(EQ, "=");
				arg2 = expr();
				read(SEMICOLON, ";");
				consts.add(new ConstDeclarationNode(arg1,arg2));
			}
			
		}  if (test(TYPE)) {
			read(TYPE, "type");
			arg1 = constIdent();
			read(EQ, "=");
			arg2 = type();
			read(SEMICOLON, ";");
			types.add(new TypeDeclarationNode(arg1,arg2));
			while (test(IDENT)) {
				arg1 = constIdent();
				read(EQ, "=");
				arg2 = type();
				read(SEMICOLON, ";");
				types.add(new TypeDeclarationNode(arg1,arg2));
			}
		}  if (test(VAR)) {
			read(VAR, "var");
			arg1 = identList();
			read(COLON, ":");
			arg2 = type();
			read(SEMICOLON, ";");
			vars.add(new VarDeclarationNode(arg1,arg2));
			while (test(IDENT)) {
				arg1 = identList();
				read(COLON, ":");
				arg2 = type();
				read(SEMICOLON, ";");
				vars.add(new VarDeclarationNode(arg1,arg2));
			}
		}
		
		while (test(PROCEDURE)) {
//			procDeclarations.add(procedureDeclaration());
			procDeclarations.add(procedure());
			read(SEMICOLON, ";");
		}
//			failExpectation("const, type, var or procedure declaration");
		return new DeclarationsNode(consts,types,vars,procDeclarations);
	}